• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright@ Samsung Electronics Co. LTD
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15 */
16 
17 /*
18  * file exynos5_format_v4l2.c
19  * author Sangwoo, Park(sw5771.park@samsung.com)
20  * date 2011/06/02
21  *
22  * Revision History:
23  * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com)
24  * Initial version
25  *
26  * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi@samsung.com)
27  * Add V4L2_PIX_FMT_YVU420M
28  *
29  * - 2012/03/06 : shinwon lee(shinwon.lee@samsung.com)
30  * Merge to libexynosutils
31  *
32  */
33 
34 #ifndef __EXYNOS5_FORMAT_V4L2_H__
35 #define __EXYNOS5_FORMAT_V4L2_H__
36 
37 //---------------------------------------------------------//
38 // Include
39 //---------------------------------------------------------//
40 #include <hardware/hardware.h>
41 #include "exynos_format.h"
42 #include "s5p_fimc_v4l2.h"
43 #include <utils/Log.h>
44 #include "videodev2.h"
45 #include "videodev2_exynos_media.h"
46 
HAL_PIXEL_FORMAT_2_V4L2_PIX(int hal_pixel_format)47 int HAL_PIXEL_FORMAT_2_V4L2_PIX(
48     int hal_pixel_format)
49 {
50     int v4l2_pixel_format = -1;
51 
52     switch (hal_pixel_format) {
53     case HAL_PIXEL_FORMAT_RGBA_8888:
54     case HAL_PIXEL_FORMAT_RGBX_8888:
55     case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
56         v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
57         break;
58 
59     case HAL_PIXEL_FORMAT_RGB_888:
60         v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
61         break;
62 
63     case HAL_PIXEL_FORMAT_RGB_565:
64         v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
65         break;
66 
67     case HAL_PIXEL_FORMAT_BGRA_8888:
68         v4l2_pixel_format = V4L2_PIX_FMT_BGR32;
69         break;
70 
71     case HAL_PIXEL_FORMAT_RGBA_5551:
72         v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
73         break;
74 
75     case HAL_PIXEL_FORMAT_RGBA_4444:
76         v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
77         break;
78 
79     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
80         v4l2_pixel_format = V4L2_PIX_FMT_YVU420M;
81         break;
82 
83     case HAL_PIXEL_FORMAT_YCbCr_420_P:
84         v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
85         break;
86 
87     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
88     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
89         v4l2_pixel_format = V4L2_PIX_FMT_NV61;
90         break;
91 
92     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
93     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
94         v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
95         break;
96 
97     case HAL_PIXEL_FORMAT_YCbCr_422_I:
98     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
99         v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
100         break;
101 
102     case HAL_PIXEL_FORMAT_YCbCr_422_P:
103         v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
104         break;
105 
106     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
107     case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
108         v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
109         break;
110 
111     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
112     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
113         v4l2_pixel_format = V4L2_PIX_FMT_NV16;
114         break;
115 
116     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
117     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
118         v4l2_pixel_format = V4L2_PIX_FMT_NV21M;
119         break;
120 
121    case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
122         v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
123         break;
124 
125     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
126         v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
127         break;
128 
129    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
130         v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
131         break;
132 
133    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
134         v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
135         break;
136 
137     default:
138         ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
139                 __func__, hal_pixel_format);
140         break;
141     }
142 
143     return v4l2_pixel_format;
144 }
145 
V4L2_PIX_2_HAL_PIXEL_FORMAT(int v4l2_pixel_format)146 int V4L2_PIX_2_HAL_PIXEL_FORMAT(
147     int v4l2_pixel_format)
148 {
149     int hal_pixel_format = -1;
150 
151     switch (v4l2_pixel_format) {
152     case V4L2_PIX_FMT_RGB32:
153         hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
154         break;
155 
156     case V4L2_PIX_FMT_RGB24:
157         hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
158         break;
159 
160     case V4L2_PIX_FMT_RGB565:
161         hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
162         break;
163 
164     case V4L2_PIX_FMT_BGR32:
165         hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
166         break;
167 
168     case V4L2_PIX_FMT_RGB555X:
169         hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
170         break;
171 
172     case V4L2_PIX_FMT_RGB444:
173         hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
174         break;
175 
176     case V4L2_PIX_FMT_YUV420:
177     case V4L2_PIX_FMT_YUV420M:
178         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
179         break;
180 
181     case V4L2_PIX_FMT_YVU420:
182     case V4L2_PIX_FMT_YVU420M:
183          hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
184          break;
185 
186     case V4L2_PIX_FMT_NV16:
187         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
188         break;
189 
190     case V4L2_PIX_FMT_NV12:
191         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
192         break;
193 
194     case V4L2_PIX_FMT_NV12M:
195         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
196         break;
197 
198     case V4L2_PIX_FMT_YUYV:
199         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
200         break;
201 
202     case V4L2_PIX_FMT_YUV422P:
203         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
204         break;
205 
206     case V4L2_PIX_FMT_UYVY:
207         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
208         break;
209 
210     case V4L2_PIX_FMT_NV21:
211         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
212         break;
213     case V4L2_PIX_FMT_NV12MT_16X16:
214 
215         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
216         break;
217 
218     case V4L2_PIX_FMT_NV61:
219         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
220         break;
221 
222     case V4L2_PIX_FMT_YVYU:
223         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
224         break;
225 
226     case V4L2_PIX_FMT_VYUY:
227         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
228         break;
229 
230     default:
231         ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
232                 __func__, v4l2_pixel_format);
233         break;
234     }
235 
236     return hal_pixel_format;
237 }
238 
NUM_PLANES(int hal_pixel_format)239 int NUM_PLANES(int hal_pixel_format)
240 {
241     switch(hal_pixel_format) {
242     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
243     case HAL_PIXEL_FORMAT_YCbCr_420_P:
244 	return 3;
245     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
246     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
247     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
248     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
249     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
250 	return 2;
251 	break;
252     case HAL_PIXEL_FORMAT_YCbCr_420_I:
253     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
254 	return 1;
255     default:
256 	return 1;
257     }
258 }
259 
FRAME_SIZE(int hal_pixel_format,int width,int height)260 unsigned int FRAME_SIZE(
261     int hal_pixel_format,
262     int width,
263     int height)
264 {
265     unsigned int frame_size = 0;
266     unsigned int size       = 0;
267 
268     switch (hal_pixel_format) {
269     // 16bpp
270     case HAL_PIXEL_FORMAT_RGB_565:
271     case HAL_PIXEL_FORMAT_RGBA_5551:
272     case HAL_PIXEL_FORMAT_RGBA_4444:
273         frame_size = GET_16BPP_FRAME_SIZE(width, height);
274         break;
275 
276     // 24bpp
277     case HAL_PIXEL_FORMAT_RGB_888:
278         frame_size = GET_24BPP_FRAME_SIZE(width, height);
279         break;
280 
281     // 32bpp
282     case HAL_PIXEL_FORMAT_RGBA_8888:
283     case HAL_PIXEL_FORMAT_BGRA_8888:
284     case HAL_PIXEL_FORMAT_RGBX_8888:
285     case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
286         frame_size = GET_32BPP_FRAME_SIZE(width, height);
287         break;
288 
289     // 12bpp
290     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
291     case HAL_PIXEL_FORMAT_YCbCr_420_P:
292     case HAL_PIXEL_FORMAT_YCbCr_420_I:
293     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
294         size = ALIGN(width, 16) * ALIGN(height, 16);
295         frame_size = size + 2 * ALIGN(width >> 1, 8) * ALIGN(height >> 1, 8);
296         break;
297 
298     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
299     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
300     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
301     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
302         size = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
303         frame_size = size + ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
304         break;
305 
306     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
307         frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
308                      + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
309         break;
310 
311     // 16bpp
312     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
313     case HAL_PIXEL_FORMAT_YCbCr_422_I:
314     case HAL_PIXEL_FORMAT_YCbCr_422_P:
315     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
316     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
317     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
318     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
319     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
320     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
321     case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
322     case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
323         frame_size = GET_16BPP_FRAME_SIZE(width, height);
324         break;
325 
326     default:
327         ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
328                 __func__, hal_pixel_format, width, height);
329         break;
330     }
331 
332     return frame_size;
333 }
334 
PLANAR_FRAME_SIZE(int hal_pixel_format,int width,int height,unsigned int * luma_size,unsigned int * chroma_size)335 int PLANAR_FRAME_SIZE(int hal_pixel_format, int width, int height,
336 		      unsigned int *luma_size, unsigned int *chroma_size)
337 {
338     unsigned int size       = 0;
339 
340     switch(hal_pixel_format) {
341     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
342     case HAL_PIXEL_FORMAT_YCbCr_420_P:
343         size = width * height;
344 	*luma_size = size;
345 	*chroma_size = size >> 2;
346     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
347     case HAL_PIXEL_FORMAT_YCbCr_420_I:
348     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
349     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
350     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
351     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
352         size = width * height;
353 	*luma_size = size;
354 	*chroma_size = (size >> 2) << 1;
355         break;
356     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
357         *luma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height));
358 	*chroma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) *
359 				    ALIGN_TO_32B(height >> 1));
360 	break;
361     default:
362 	*luma_size = FRAME_SIZE(hal_pixel_format, width, height);
363     }
364     return 0;
365 }
366 
367 
V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format,unsigned int * bpp,unsigned int * planes)368 int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes)
369 {
370     switch (v4l2_pixel_format) {
371     case V4L2_PIX_FMT_NV12:
372         *bpp    = 12;
373         *planes = 1;
374         break;
375     case V4L2_PIX_FMT_NV21:
376     case V4L2_PIX_FMT_NV21X:
377     case V4L2_PIX_FMT_NV12M:
378     case V4L2_PIX_FMT_NV21M:
379     case V4L2_PIX_FMT_NV12MT_16X16:
380         *bpp    = 12;
381         *planes = 2;
382         break;
383     case V4L2_PIX_FMT_YUV420:
384     case V4L2_PIX_FMT_YUV420M:
385     case V4L2_PIX_FMT_YVU420M:
386         *bpp    = 12;
387         *planes = 3;
388         break;
389     case V4L2_PIX_FMT_YUYV:
390     case V4L2_PIX_FMT_YVYU:
391     case V4L2_PIX_FMT_UYVY:
392     case V4L2_PIX_FMT_VYUY:
393         *bpp    = 16;
394         *planes = 1;
395         break;
396     case V4L2_PIX_FMT_NV16:
397     case V4L2_PIX_FMT_NV61:
398     case V4L2_PIX_FMT_NV16X:
399     case V4L2_PIX_FMT_NV61X:
400         *bpp    = 16;
401         *planes = 2;
402         break;
403     case V4L2_PIX_FMT_YUV422P:
404         *bpp    = 16;
405         *planes = 3;
406         break;
407     default:
408         return -1;
409         break;
410     }
411 
412     return 0;
413 }
414 
get_yuv_bpp(unsigned int v4l2_pixel_format)415 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format)
416 {
417     unsigned int bpp, planes;
418 
419     if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
420         bpp = -1;
421 
422     return bpp;
423 }
424 
get_yuv_planes(unsigned int v4l2_pixel_format)425 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format)
426 {
427     unsigned int bpp, planes;
428 
429     if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
430         planes = -1;
431 
432     return planes;
433 }
434 #endif
435