• 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 };
VENUS_EXTRADATA_SIZE(int width,int height)139 static inline unsigned int VENUS_EXTRADATA_SIZE(int width, int height)
140 {
141 	(void)height;
142 	(void)width;
143 
144 	/*
145 	 * In the future, calculate the size based on the w/h but just
146 	 * hardcode it for now since 8K satisfies all current usecases.
147 	 */
148 	return 8 * 1024;
149 }
150 
VENUS_Y_STRIDE(int color_fmt,int width)151 static inline unsigned int VENUS_Y_STRIDE(int color_fmt, int width)
152 {
153 	unsigned int alignment, stride = 0;
154 	if (!width)
155 		goto invalid_input;
156 
157 	switch (color_fmt) {
158 	case COLOR_FMT_NV21:
159 	case COLOR_FMT_NV12:
160 	case COLOR_FMT_NV12_MVTB:
161 		alignment = 128;
162 		stride = MSM_MEDIA_ALIGN(width, alignment);
163 		break;
164 	default:
165 		break;
166 	}
167 invalid_input:
168 	return stride;
169 }
170 
VENUS_UV_STRIDE(int color_fmt,int width)171 static inline unsigned int VENUS_UV_STRIDE(int color_fmt, int width)
172 {
173 	unsigned int alignment, stride = 0;
174 	if (!width)
175 		goto invalid_input;
176 
177 	switch (color_fmt) {
178 	case COLOR_FMT_NV21:
179 	case COLOR_FMT_NV12:
180 	case COLOR_FMT_NV12_MVTB:
181 		alignment = 128;
182 		stride = MSM_MEDIA_ALIGN(width, alignment);
183 		break;
184 	default:
185 		break;
186 	}
187 invalid_input:
188 	return stride;
189 }
190 
VENUS_Y_SCANLINES(int color_fmt,int height)191 static inline unsigned int VENUS_Y_SCANLINES(int color_fmt, int height)
192 {
193 	unsigned int alignment, sclines = 0;
194 	if (!height)
195 		goto invalid_input;
196 
197 	switch (color_fmt) {
198 	case COLOR_FMT_NV21:
199 	case COLOR_FMT_NV12:
200 	case COLOR_FMT_NV12_MVTB:
201 		alignment = 32;
202 		sclines = MSM_MEDIA_ALIGN(height, alignment);
203 		break;
204 	default:
205 		break;
206 	}
207 invalid_input:
208 	return sclines;
209 }
210 
VENUS_UV_SCANLINES(int color_fmt,int height)211 static inline unsigned int VENUS_UV_SCANLINES(int color_fmt, int height)
212 {
213 	unsigned int alignment, sclines = 0;
214 	if (!height)
215 		goto invalid_input;
216 
217 	switch (color_fmt) {
218 	case COLOR_FMT_NV21:
219 	case COLOR_FMT_NV12:
220 	case COLOR_FMT_NV12_MVTB:
221 		alignment = 16;
222 		sclines = MSM_MEDIA_ALIGN(((height + 1) >> 1), alignment);
223 		break;
224 	default:
225 		break;
226 	}
227 invalid_input:
228 	return sclines;
229 }
230 
VENUS_BUFFER_SIZE(int color_fmt,int width,int height)231 static inline unsigned int VENUS_BUFFER_SIZE(
232 	int color_fmt, int width, int height)
233 {
234 	const unsigned int extra_size = VENUS_EXTRADATA_SIZE(width, height);
235 	unsigned int uv_alignment = 0, size = 0;
236 	unsigned int y_plane, uv_plane, y_stride,
237 		uv_stride, y_sclines, uv_sclines;
238 	if (!width || !height)
239 		goto invalid_input;
240 
241 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
242 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
243 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
244 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
245 	switch (color_fmt) {
246 	case COLOR_FMT_NV21:
247 	case COLOR_FMT_NV12:
248 		uv_alignment = 4096;
249 		y_plane = y_stride * y_sclines;
250 		uv_plane = uv_stride * uv_sclines + uv_alignment;
251 		size = y_plane + uv_plane + extra_size;
252 		size = MSM_MEDIA_ALIGN(size, 4096);
253 		break;
254 	case COLOR_FMT_NV12_MVTB:
255 		uv_alignment = 4096;
256 		y_plane = y_stride * y_sclines;
257 		uv_plane = uv_stride * uv_sclines + uv_alignment;
258 		size = y_plane + uv_plane;
259 		size = 2 * size + extra_size;
260 		size = MSM_MEDIA_ALIGN(size, 4096);
261 		break;
262 	default:
263 		break;
264 	}
265 invalid_input:
266 	return size;
267 }
268 
VENUS_VIEW2_OFFSET(int color_fmt,int width,int height)269 static inline unsigned int VENUS_VIEW2_OFFSET(
270 	int color_fmt, int width, int height)
271 {
272 	unsigned int offset = 0;
273 	unsigned int y_plane, uv_plane, y_stride,
274 		uv_stride, y_sclines, uv_sclines;
275 	if (!width || !height)
276 		goto invalid_input;
277 
278 	y_stride = VENUS_Y_STRIDE(color_fmt, width);
279 	uv_stride = VENUS_UV_STRIDE(color_fmt, width);
280 	y_sclines = VENUS_Y_SCANLINES(color_fmt, height);
281 	uv_sclines = VENUS_UV_SCANLINES(color_fmt, height);
282 	switch (color_fmt) {
283 	case COLOR_FMT_NV12_MVTB:
284 		y_plane = y_stride * y_sclines;
285 		uv_plane = uv_stride * uv_sclines;
286 		offset = y_plane + uv_plane;
287 		break;
288 	default:
289 		break;
290 	}
291 invalid_input:
292 	return offset;
293 }
294 
295 #endif
296