• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __MEDIA_INFO_H__
2 #define __MEDIA_INFO_H__
3 
4 #ifndef MSM_MEDIA_ALIGN
5 #define MSM_MEDIA_ALIGN(__sz, __align) (((__sz) + (__align-1)) & (~(__align-1)))
6 #endif
7 
8 enum color_fmts {
9 	/* Venus NV12:
10 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
11 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
12 	 * colour difference samples.
13 	 *
14 	 * <-------- Y/UV_Stride -------->
15 	 * <------- Width ------->
16 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  ^           ^
17 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
18 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  Height      |
19 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |          Y_Scanlines
20 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
21 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
22 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
23 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  V           |
24 	 * X X X X X X X X X X X X X X X X              |
25 	 * X X X X X X X X X X X X X X X X              |
26 	 * X X X X X X X X X X X X X X X X              |
27 	 * X X X X X X X X X X X X X X X X              V
28 	 * U V U V U V U V U V U V X X X X  ^
29 	 * U V U V U V U V U V U V X X X X  |
30 	 * U V U V U V U V U V U V X X X X  |
31 	 * U V U V U V U V U V U V X X X X  UV_Scanlines
32 	 * X X X X X X X X X X X X X X X X  |
33 	 * X X X X X X X X X X X X X X X X  V
34 	 * X X X X X X X X X X X X X X X X  --> Buffer size alignment
35 	 *
36 	 * Y_Stride : Width aligned to 128
37 	 * UV_Stride : Width aligned to 128
38 	 * Y_Scanlines: Height aligned to 32
39 	 * UV_Scanlines: Height/2 aligned to 16
40 	 * Total size = align((Y_Stride * Y_Scanlines
41 	 *          + UV_Stride * UV_Scanlines + 4096), 4096)
42 	 */
43 	COLOR_FMT_NV12,
44 
45 	/* Venus NV21:
46 	 * YUV 4:2:0 image with a plane of 8 bit Y samples followed
47 	 * by an interleaved V/U plane containing 8 bit 2x2 subsampled
48 	 * colour difference samples.
49 	 *
50 	 * <-------- Y/UV_Stride -------->
51 	 * <------- Width ------->
52 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  ^           ^
53 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
54 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  Height      |
55 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |          Y_Scanlines
56 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
57 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
58 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |
59 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  V           |
60 	 * X X X X X X X X X X X X X X X X              |
61 	 * X X X X X X X X X X X X X X X X              |
62 	 * X X X X X X X X X X X X X X X X              |
63 	 * X X X X X X X X X X X X X X X X              V
64 	 * V U V U V U V U V U V U X X X X  ^
65 	 * V U V U V U V U V U V U X X X X  |
66 	 * V U V U V U V U V U V U X X X X  |
67 	 * V U V U V U V U V U V U X X X X  UV_Scanlines
68 	 * X X X X X X X X X X X X X X X X  |
69 	 * X X X X X X X X X X X X X X X X  V
70 	 * X X X X X X X X X X X X X X X X  --> Padding & Buffer size alignment
71 	 *
72 	 * Y_Stride : Width aligned to 128
73 	 * UV_Stride : Width aligned to 128
74 	 * Y_Scanlines: Height aligned to 32
75 	 * UV_Scanlines: Height/2 aligned to 16
76 	 * Total size = align((Y_Stride * Y_Scanlines
77 	 *          + UV_Stride * UV_Scanlines + 4096), 4096)
78 	 */
79 	COLOR_FMT_NV21,
80 	/* Venus NV12_MVTB:
81 	 * Two YUV 4:2:0 images/views one after the other
82 	 * in a top-bottom layout, same as NV12
83 	 * with a plane of 8 bit Y samples followed
84 	 * by an interleaved U/V plane containing 8 bit 2x2 subsampled
85 	 * colour difference samples.
86 	 *
87 	 *
88 	 * <-------- Y/UV_Stride -------->
89 	 * <------- Width ------->
90 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  ^           ^               ^
91 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
92 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  Height      |               |
93 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |          Y_Scanlines      |
94 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
95 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
96 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
97 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  V           |               |
98 	 * X X X X X X X X X X X X X X X X              |             View_1
99 	 * X X X X X X X X X X X X X X X X              |               |
100 	 * X X X X X X X X X X X X X X X X              |               |
101 	 * X X X X X X X X X X X X X X X X              V               |
102 	 * U V U V U V U V U V U V X X X X  ^                           |
103 	 * U V U V U V U V U V U V X X X X  |                           |
104 	 * U V U V U V U V U V U V X X X X  |                           |
105 	 * U V U V U V U V U V U V X X X X  UV_Scanlines                |
106 	 * X X X X X X X X X X X X X X X X  |                           |
107 	 * X X X X X X X X X X X X X X X X  V                           V
108 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  ^           ^               ^
109 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
110 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  Height      |               |
111 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |          Y_Scanlines      |
112 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
113 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
114 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  |           |               |
115 	 * Y Y Y Y Y Y Y Y Y Y Y Y X X X X  V           |               |
116 	 * X X X X X X X X X X X X X X X X              |             View_2
117 	 * X X X X X X X X X X X X X X X X              |               |
118 	 * X X X X X X X X X X X X X X X X              |               |
119 	 * X X X X X X X X X X X X X X X X              V               |
120 	 * U V U V U V U V U V U V X X X X  ^                           |
121 	 * U V U V U V U V U V U V X X X X  |                           |
122 	 * U V U V U V U V U V U V X X X X  |                           |
123 	 * U V U V U V U V U V U V X X X X  UV_Scanlines                |
124 	 * X X X X X X X X X X X X X X X X  |                           |
125 	 * X X X X X X X X X X X X X X X X  V                           V
126 	 * X X X X X X X X X X X X X X X X  --> Buffer size alignment
127 	 *
128 	 * Y_Stride : Width aligned to 128
129 	 * UV_Stride : Width aligned to 128
130 	 * Y_Scanlines: Height aligned to 32
131 	 * UV_Scanlines: Height/2 aligned to 16
132 	 * View_1 begin at: 0 (zero)
133 	 * View_2 begin at: Y_Stride * Y_Scanlines + UV_Stride * UV_Scanlines
134 	 * Total size = align((2*(Y_Stride * Y_Scanlines)
135 	 *          + 2*(UV_Stride * UV_Scanlines) + 4096), 4096)
136 	 */
137 	COLOR_FMT_NV12_MVTB,
138 };
139 
VENUS_Y_STRIDE(int color_fmt,int width)140 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
141 {
142 	unsigned int alignment, stride = 0;
143 	if (!width)
144 		goto invalid_input;
145 
146 	switch (color_fmt) {
147 	case COLOR_FMT_NV21:
148 	case COLOR_FMT_NV12:
149 	case COLOR_FMT_NV12_MVTB:
150 		alignment = 128;
151 		stride = MSM_MEDIA_ALIGN(width, alignment);
152 		break;
153 	default:
154 		break;
155 	}
156 invalid_input:
157 	return stride;
158 }
159 
VENUS_UV_STRIDE(int color_fmt,int width)160 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
161 {
162 	unsigned int alignment, stride = 0;
163 	if (!width)
164 		goto invalid_input;
165 
166 	switch (color_fmt) {
167 	case COLOR_FMT_NV21:
168 	case COLOR_FMT_NV12:
169 	case COLOR_FMT_NV12_MVTB:
170 		alignment = 128;
171 		stride = MSM_MEDIA_ALIGN(width, alignment);
172 		break;
173 	default:
174 		break;
175 	}
176 invalid_input:
177 	return stride;
178 }
179 
VENUS_Y_SCANLINES(int color_fmt,int height)180 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
181 {
182 	unsigned int alignment, sclines = 0;
183 	if (!height)
184 		goto invalid_input;
185 
186 	switch (color_fmt) {
187 	case COLOR_FMT_NV21:
188 	case COLOR_FMT_NV12:
189 	case COLOR_FMT_NV12_MVTB:
190 		alignment = 32;
191 		sclines = MSM_MEDIA_ALIGN(height, alignment);
192 		break;
193 	default:
194 		break;
195 	}
196 invalid_input:
197 	return sclines;
198 }
199 
VENUS_UV_SCANLINES(int color_fmt,int height)200 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
201 {
202 	unsigned int alignment, sclines = 0;
203 	if (!height)
204 		goto invalid_input;
205 
206 	switch (color_fmt) {
207 	case COLOR_FMT_NV21:
208 	case COLOR_FMT_NV12:
209 	case COLOR_FMT_NV12_MVTB:
210 		alignment = 16;
211 		sclines = MSM_MEDIA_ALIGN(((height + 1) >> 1), alignment);
212 		break;
213 	default:
214 		break;
215 	}
216 invalid_input:
217 	return sclines;
218 }
219 
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)220 static inline unsigned int VENUS_BUFFER_SIZE(
221 	int color_fmt, int width, int height)
222 {
223 	unsigned int uv_alignment;
224 	unsigned int size = 0;
225 	unsigned int y_plane, uv_plane, y_stride,
226 		uv_stride, y_sclines, uv_sclines;
227 	if (!width || !height)
228 		goto invalid_input;
229 
230 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
231 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
232 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
233 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
234 	switch (color_fmt) {
235 	case COLOR_FMT_NV21:
236 	case COLOR_FMT_NV12:
237 		uv_alignment = 4096;
238 		y_plane = y_stride * y_sclines;
239 		uv_plane = uv_stride * uv_sclines + uv_alignment;
240 		size = y_plane + uv_plane;
241 		size = MSM_MEDIA_ALIGN(size, 4096);
242 		break;
243 	case COLOR_FMT_NV12_MVTB:
244 		uv_alignment = 4096;
245 		y_plane = y_stride * y_sclines;
246 		uv_plane = uv_stride * uv_sclines;
247 		size = y_plane + uv_plane;
248 		size = 2 * size + uv_alignment;
249 		size = MSM_MEDIA_ALIGN(size, 4096);
250 		break;
251 	default:
252 		break;
253 	}
254 invalid_input:
255 	return size;
256 }
257 
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)258 static inline unsigned int VENUS_VIEW2_OFFSET(
259 	int color_fmt, int width, int height)
260 {
261 	unsigned int offset = 0;
262 	unsigned int y_plane, uv_plane, y_stride,
263 		uv_stride, y_sclines, uv_sclines;
264 	if (!width || !height)
265 		goto invalid_input;
266 
267 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
268 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
269 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
270 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
271 	switch (color_fmt) {
272 	case COLOR_FMT_NV12_MVTB:
273 		y_plane = y_stride * y_sclines;
274 		uv_plane = uv_stride * uv_sclines;
275 		offset = y_plane + uv_plane;
276 		break;
277 	default:
278 		break;
279 	}
280 invalid_input:
281 	return offset;
282 }
283 
284 #endif
285