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