• 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 <linux/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_EXYNOS_YV12:
72         v4l2_pixel_format = V4L2_PIX_FMT_YVU420M;
73         break;
74 
75     case HAL_PIXEL_FORMAT_YCbCr_420_P:
76         v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
77         break;
78 
79     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
80     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
81         v4l2_pixel_format = V4L2_PIX_FMT_NV61;
82         break;
83 
84     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
85     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
86         v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
87         break;
88 
89     case HAL_PIXEL_FORMAT_YCbCr_422_I:
90     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
91         v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
92         break;
93 
94     case HAL_PIXEL_FORMAT_YCbCr_422_P:
95         v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
96         break;
97 
98     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
99     case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
100         v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
101         break;
102 
103     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
104     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
105         v4l2_pixel_format = V4L2_PIX_FMT_NV16;
106         break;
107 
108     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
109     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
110         v4l2_pixel_format = V4L2_PIX_FMT_NV21M;
111         break;
112 
113    case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
114         v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
115         break;
116 
117     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
118         v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
119         break;
120 
121    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
122         v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
123         break;
124 
125    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
126         v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
127         break;
128 
129     default:
130         ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
131                 __func__, hal_pixel_format);
132         break;
133     }
134 
135     return v4l2_pixel_format;
136 }
137 
V4L2_PIX_2_HAL_PIXEL_FORMAT(int v4l2_pixel_format)138 int V4L2_PIX_2_HAL_PIXEL_FORMAT(
139     int v4l2_pixel_format)
140 {
141     int hal_pixel_format = -1;
142 
143     switch (v4l2_pixel_format) {
144     case V4L2_PIX_FMT_RGB32:
145         hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
146         break;
147 
148     case V4L2_PIX_FMT_RGB24:
149         hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
150         break;
151 
152     case V4L2_PIX_FMT_RGB565:
153         hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
154         break;
155 
156     case V4L2_PIX_FMT_BGR32:
157         hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
158         break;
159 
160     case V4L2_PIX_FMT_YUV420:
161     case V4L2_PIX_FMT_YUV420M:
162         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
163         break;
164 
165     case V4L2_PIX_FMT_YVU420:
166     case V4L2_PIX_FMT_YVU420M:
167          hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
168          break;
169 
170     case V4L2_PIX_FMT_NV16:
171         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
172         break;
173 
174     case V4L2_PIX_FMT_NV12:
175         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
176         break;
177 
178     case V4L2_PIX_FMT_NV12M:
179         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
180         break;
181 
182     case V4L2_PIX_FMT_YUYV:
183         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
184         break;
185 
186     case V4L2_PIX_FMT_YUV422P:
187         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
188         break;
189 
190     case V4L2_PIX_FMT_UYVY:
191         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
192         break;
193 
194     case V4L2_PIX_FMT_NV21:
195         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
196         break;
197     case V4L2_PIX_FMT_NV12MT_16X16:
198 
199         hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
200         break;
201 
202     case V4L2_PIX_FMT_NV61:
203         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
204         break;
205 
206     case V4L2_PIX_FMT_YVYU:
207         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
208         break;
209 
210     case V4L2_PIX_FMT_VYUY:
211         hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
212         break;
213 
214     default:
215         ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
216                 __func__, v4l2_pixel_format);
217         break;
218     }
219 
220     return hal_pixel_format;
221 }
222 
NUM_PLANES(int hal_pixel_format)223 int NUM_PLANES(int hal_pixel_format)
224 {
225     switch(hal_pixel_format) {
226     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
227     case HAL_PIXEL_FORMAT_YCbCr_420_P:
228 	return 3;
229     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
230     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
231     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
232     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
233     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
234 	return 2;
235 	break;
236     case HAL_PIXEL_FORMAT_YCbCr_420_I:
237     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
238 	return 1;
239     default:
240 	return 1;
241     }
242 }
243 
FRAME_SIZE(int hal_pixel_format,int width,int height)244 unsigned int FRAME_SIZE(
245     int hal_pixel_format,
246     int width,
247     int height)
248 {
249     unsigned int frame_size = 0;
250     unsigned int size       = 0;
251 
252     switch (hal_pixel_format) {
253     // 16bpp
254     case HAL_PIXEL_FORMAT_RGB_565:
255         frame_size = GET_16BPP_FRAME_SIZE(width, height);
256         break;
257 
258     // 24bpp
259     case HAL_PIXEL_FORMAT_RGB_888:
260         frame_size = GET_24BPP_FRAME_SIZE(width, height);
261         break;
262 
263     // 32bpp
264     case HAL_PIXEL_FORMAT_RGBA_8888:
265     case HAL_PIXEL_FORMAT_BGRA_8888:
266     case HAL_PIXEL_FORMAT_RGBX_8888:
267     case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
268         frame_size = GET_32BPP_FRAME_SIZE(width, height);
269         break;
270 
271     // 12bpp
272     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
273     case HAL_PIXEL_FORMAT_YCbCr_420_P:
274     case HAL_PIXEL_FORMAT_YCbCr_420_I:
275     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
276         size = ALIGN(width, 16) * ALIGN(height, 16);
277         frame_size = size + 2 * ALIGN(width >> 1, 8) * ALIGN(height >> 1, 8);
278         break;
279 
280     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
281     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
282     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
283     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
284         size = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
285         frame_size = size + ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
286         break;
287 
288     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
289         frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
290                      + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
291         break;
292 
293     // 16bpp
294     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
295     case HAL_PIXEL_FORMAT_YCbCr_422_I:
296     case HAL_PIXEL_FORMAT_YCbCr_422_P:
297     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
298     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
299     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
300     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
301     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
302     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
303     case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
304     case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
305         frame_size = GET_16BPP_FRAME_SIZE(width, height);
306         break;
307 
308     default:
309         ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
310                 __func__, hal_pixel_format, width, height);
311         break;
312     }
313 
314     return frame_size;
315 }
316 
PLANAR_FRAME_SIZE(int hal_pixel_format,int width,int height,unsigned int * luma_size,unsigned int * chroma_size)317 int PLANAR_FRAME_SIZE(int hal_pixel_format, int width, int height,
318 		      unsigned int *luma_size, unsigned int *chroma_size)
319 {
320     unsigned int size       = 0;
321 
322     switch(hal_pixel_format) {
323     case HAL_PIXEL_FORMAT_EXYNOS_YV12:
324     case HAL_PIXEL_FORMAT_YCbCr_420_P:
325         size = width * height;
326 	*luma_size = size;
327 	*chroma_size = size >> 2;
328     case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
329     case HAL_PIXEL_FORMAT_YCbCr_420_I:
330     case HAL_PIXEL_FORMAT_CbYCrY_420_I:
331     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
332     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
333     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
334         size = width * height;
335 	*luma_size = size;
336 	*chroma_size = (size >> 2) << 1;
337         break;
338     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
339         *luma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height));
340 	*chroma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) *
341 				    ALIGN_TO_32B(height >> 1));
342 	break;
343     default:
344 	*luma_size = FRAME_SIZE(hal_pixel_format, width, height);
345     }
346     return 0;
347 }
348 
349 
V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format,unsigned int * bpp,unsigned int * planes)350 int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes)
351 {
352     switch (v4l2_pixel_format) {
353     case V4L2_PIX_FMT_NV12:
354         *bpp    = 12;
355         *planes = 1;
356         break;
357     case V4L2_PIX_FMT_NV21:
358     case V4L2_PIX_FMT_NV21X:
359     case V4L2_PIX_FMT_NV12M:
360     case V4L2_PIX_FMT_NV21M:
361     case V4L2_PIX_FMT_NV12MT_16X16:
362         *bpp    = 12;
363         *planes = 2;
364         break;
365     case V4L2_PIX_FMT_YUV420:
366     case V4L2_PIX_FMT_YUV420M:
367     case V4L2_PIX_FMT_YVU420M:
368         *bpp    = 12;
369         *planes = 3;
370         break;
371     case V4L2_PIX_FMT_YUYV:
372     case V4L2_PIX_FMT_YVYU:
373     case V4L2_PIX_FMT_UYVY:
374     case V4L2_PIX_FMT_VYUY:
375         *bpp    = 16;
376         *planes = 1;
377         break;
378     case V4L2_PIX_FMT_NV16:
379     case V4L2_PIX_FMT_NV61:
380     case V4L2_PIX_FMT_NV16X:
381     case V4L2_PIX_FMT_NV61X:
382         *bpp    = 16;
383         *planes = 2;
384         break;
385     case V4L2_PIX_FMT_YUV422P:
386         *bpp    = 16;
387         *planes = 3;
388         break;
389     default:
390         return -1;
391         break;
392     }
393 
394     return 0;
395 }
396 
get_yuv_bpp(unsigned int v4l2_pixel_format)397 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format)
398 {
399     unsigned int bpp, planes;
400 
401     if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
402         bpp = -1;
403 
404     return bpp;
405 }
406 
get_yuv_planes(unsigned int v4l2_pixel_format)407 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format)
408 {
409     unsigned int bpp, planes;
410 
411     if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
412         planes = -1;
413 
414     return planes;
415 }
416 #endif
417