1 /*
2  * xcam_buffer.cpp - video buffer standard version
3  *
4  *  Copyright (c) 2016 Intel Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Author: Wind Yuan <feng.yuan@intel.com>
19  */
20 
21 #include <base/xcam_buffer.h>
22 
23 XCamReturn
xcam_video_buffer_info_reset(XCamVideoBufferInfo * info,uint32_t format,uint32_t width,uint32_t height,uint32_t aligned_width,uint32_t aligned_height,uint32_t size)24 xcam_video_buffer_info_reset (
25     XCamVideoBufferInfo *info,
26     uint32_t format,
27     uint32_t width, uint32_t height,
28     uint32_t aligned_width, uint32_t aligned_height, uint32_t size)
29 {
30     uint32_t image_size = 0;
31     uint32_t i = 0;
32 
33     XCAM_ASSERT (info && format);
34     XCAM_ASSERT (!aligned_width  || aligned_width >= width);
35     XCAM_ASSERT (!aligned_height  || aligned_height >= height);
36 
37     if (!aligned_width)
38         aligned_width = XCAM_ALIGN_UP (width, 4);
39     if (!aligned_height)
40         aligned_height = XCAM_ALIGN_UP (height, 2);
41 
42     info->format = format;
43     info->width = width;
44     info->height = height;
45     info->aligned_width = aligned_width;
46     info->aligned_height = aligned_height;
47 
48     switch (format) {
49     case V4L2_PIX_FMT_GREY:
50         info->color_bits = 8;
51         info->components = 1;
52         info->strides [0] = aligned_width;
53         info->offsets [0] = 0;
54         image_size = info->strides [0] * aligned_height;
55         break;
56     case V4L2_PIX_FMT_NV12:
57         info->color_bits = 8;
58         info->components = 2;
59         info->strides [0] = aligned_width;
60         info->strides [1] = info->strides [0];
61         info->offsets [0] = 0;
62         info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
63         image_size = info->strides [0] * aligned_height + info->strides [1] * aligned_height / 2;
64         break;
65     case V4L2_PIX_FMT_YUYV:
66         info->color_bits = 8;
67         info->components = 1;
68         info->strides [0] = aligned_width * 2;
69         info->offsets [0] = 0;
70         image_size = info->strides [0] * aligned_height;
71         break;
72     case V4L2_PIX_FMT_RGB565:
73         info->color_bits = 16;
74         info->components = 1;
75         info->strides [0] = aligned_width * 2;
76         info->offsets [0] = 0;
77         image_size = info->strides [0] * aligned_height;
78         break;
79     case V4L2_PIX_FMT_RGB24:
80         info->color_bits = 8;
81         info->components = 1;
82         info->strides [0] = aligned_width * 3;
83         info->offsets [0] = 0;
84         image_size = info->strides [0] * aligned_height;
85         break;
86         // memory order RGBA 8-8-8-8
87     case V4L2_PIX_FMT_RGBA32:
88         // memory order: BGRA 8-8-8-8
89     case V4L2_PIX_FMT_XBGR32:
90     case V4L2_PIX_FMT_ABGR32:
91     case V4L2_PIX_FMT_BGR32:
92         // memory order: ARGB 8-8-8-8
93     case V4L2_PIX_FMT_RGB32:
94     case V4L2_PIX_FMT_ARGB32:
95     case V4L2_PIX_FMT_XRGB32:
96         info->color_bits = 8;
97         info->components = 1;
98         info->strides [0] = aligned_width * 4;
99         info->offsets [0] = 0;
100         image_size = info->strides [0] * aligned_height;
101         break;
102     case XCAM_PIX_FMT_RGB48:
103         info->color_bits = 16;
104         info->components = 1;
105         info->strides [0] = aligned_width * 3 * 2;
106         info->offsets [0] = 0;
107         image_size = info->strides [0] * aligned_height;
108         break;
109     case XCAM_PIX_FMT_RGBA64:
110         info->color_bits = 16;
111         info->components = 1;
112         info->strides [0] = aligned_width * 4 * 2;
113         info->offsets [0] = 0;
114         image_size = info->strides [0] * aligned_height;
115         break;
116 
117     case V4L2_PIX_FMT_SBGGR8:
118     case V4L2_PIX_FMT_SGBRG8:
119     case V4L2_PIX_FMT_SGRBG8:
120     case V4L2_PIX_FMT_SRGGB8:
121         info->color_bits = 8;
122         info->components = 1;
123         info->strides [0] = aligned_width;
124         info->offsets [0] = 0;
125         image_size = info->strides [0] * aligned_height;
126         break;
127 
128     case V4L2_PIX_FMT_SBGGR10:
129     case V4L2_PIX_FMT_SGBRG10:
130     case V4L2_PIX_FMT_SGRBG10:
131     case V4L2_PIX_FMT_SRGGB10:
132         info->color_bits = 10;
133         info->components = 1;
134         info->strides [0] = aligned_width * 2;
135         info->offsets [0] = 0;
136         image_size = info->strides [0] * aligned_height;
137         break;
138 
139     case V4L2_PIX_FMT_SBGGR12:
140     case V4L2_PIX_FMT_SGBRG12:
141     case V4L2_PIX_FMT_SGRBG12:
142     case V4L2_PIX_FMT_SRGGB12:
143         info->color_bits = 12;
144         info->components = 1;
145         info->strides [0] = aligned_width * 2;
146         info->offsets [0] = 0;
147         image_size = info->strides [0] * aligned_height;
148         break;
149 
150     case V4L2_PIX_FMT_SBGGR16:
151     case XCAM_PIX_FMT_SGRBG16:
152         info->color_bits = 16;
153         info->components = 1;
154         info->strides [0] = aligned_width * 2;
155         info->offsets [0] = 0;
156         image_size = info->strides [0] * aligned_height;
157         break;
158 
159     case XCAM_PIX_FMT_LAB:
160         info->color_bits = 8;
161         info->components = 1;
162         info->strides [0] = aligned_width * 3;
163         info->offsets [0] = 0;
164         image_size = info->strides [0] * aligned_height;
165         break;
166 
167     case XCAM_PIX_FMT_RGB48_planar:
168     case XCAM_PIX_FMT_RGB24_planar:
169         if (XCAM_PIX_FMT_RGB48_planar == format)
170             info->color_bits = 16;
171         else
172             info->color_bits = 8;
173         info->components = 3;
174         info->strides [0] = info->strides [1] = info->strides [2] = aligned_width * (info->color_bits / 8);
175         info->offsets [0] = 0;
176         info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
177         info->offsets [2] = info->offsets [1] + info->strides [1] * aligned_height;
178         image_size = info->offsets [2] + info->strides [2] * aligned_height;
179         break;
180 
181     case XCAM_PIX_FMT_SGRBG16_planar:
182     case XCAM_PIX_FMT_SGRBG8_planar:
183         if (XCAM_PIX_FMT_SGRBG16_planar == format)
184             info->color_bits = 16;
185         else
186             info->color_bits = 8;
187         info->components = 4;
188         for (i = 0; i < info->components; ++i) {
189             info->strides [i] = aligned_width * (info->color_bits / 8);
190         }
191         info->offsets [0] = 0;
192         for (i = 1; i < info->components; ++i) {
193             info->offsets [i] = info->offsets [i - 1] + info->strides [i - 1] * aligned_height;
194         }
195         image_size = info->offsets [info->components - 1] + info->strides [info->components - 1] * aligned_height;
196         break;
197 
198     default:
199         XCAM_LOG_WARNING ("XCamVideoBufferInfo reset failed, unsupported format:%s", xcam_fourcc_to_string (format));
200         return XCAM_RETURN_ERROR_PARAM;
201     }
202 
203     if (!size)
204         info->size = image_size;
205     else {
206         XCAM_ASSERT (size >= image_size);
207         info->size = size;
208     }
209 
210     return XCAM_RETURN_NO_ERROR;
211 }
212 
213 XCamReturn
xcam_video_buffer_get_planar_info(const XCamVideoBufferInfo * buf_info,XCamVideoBufferPlanarInfo * planar_info,const uint32_t index)214 xcam_video_buffer_get_planar_info (
215     const XCamVideoBufferInfo *buf_info,  XCamVideoBufferPlanarInfo *planar_info, const uint32_t index)
216 {
217     XCAM_ASSERT (buf_info);
218     XCAM_ASSERT (planar_info);
219 
220     planar_info->width = buf_info->width;
221     planar_info->height = buf_info->height;
222     planar_info->pixel_bytes = XCAM_ALIGN_UP (buf_info->color_bits, 8) / 8;
223 
224     switch (buf_info->format) {
225     case V4L2_PIX_FMT_NV12:
226         XCAM_ASSERT (index <= 1);
227         if (index == 1) {
228             planar_info->height = buf_info->height / 2;
229         }
230         break;
231 
232     case V4L2_PIX_FMT_GREY:
233     case V4L2_PIX_FMT_YUYV:
234     case V4L2_PIX_FMT_RGB565:
235     case V4L2_PIX_FMT_SBGGR8:
236     case V4L2_PIX_FMT_SGBRG8:
237     case V4L2_PIX_FMT_SGRBG8:
238     case V4L2_PIX_FMT_SRGGB8:
239     case V4L2_PIX_FMT_SBGGR10:
240     case V4L2_PIX_FMT_SGBRG10:
241     case V4L2_PIX_FMT_SGRBG10:
242     case V4L2_PIX_FMT_SRGGB10:
243     case V4L2_PIX_FMT_SBGGR12:
244     case V4L2_PIX_FMT_SGBRG12:
245     case V4L2_PIX_FMT_SGRBG12:
246     case V4L2_PIX_FMT_SRGGB12:
247     case V4L2_PIX_FMT_SBGGR16:
248     case XCAM_PIX_FMT_SGRBG16:
249         XCAM_ASSERT (index <= 0);
250         break;
251 
252     case V4L2_PIX_FMT_RGB24:
253         XCAM_ASSERT (index <= 0);
254         planar_info->pixel_bytes = 3;
255         break;
256 
257     case V4L2_PIX_FMT_RGBA32:
258     case V4L2_PIX_FMT_XBGR32:
259     case V4L2_PIX_FMT_ABGR32:
260     case V4L2_PIX_FMT_BGR32:
261     case V4L2_PIX_FMT_RGB32:
262     case V4L2_PIX_FMT_ARGB32:
263     case V4L2_PIX_FMT_XRGB32:
264         XCAM_ASSERT (index <= 0);
265         planar_info->pixel_bytes = 4;
266         break;
267 
268     case XCAM_PIX_FMT_RGB48:
269         XCAM_ASSERT (index <= 0);
270         planar_info->pixel_bytes = 3 * 2;
271         break;
272 
273     case XCAM_PIX_FMT_RGBA64:
274         planar_info->pixel_bytes = 4 * 2;
275         break;
276 
277     case XCAM_PIX_FMT_LAB:
278         planar_info->pixel_bytes = 3;
279         break;
280 
281     case XCAM_PIX_FMT_RGB48_planar:
282     case XCAM_PIX_FMT_RGB24_planar:
283         XCAM_ASSERT (index <= 2);
284         break;
285 
286     case XCAM_PIX_FMT_SGRBG16_planar:
287     case XCAM_PIX_FMT_SGRBG8_planar:
288         XCAM_ASSERT (index <= 3);
289         break;
290 
291     default:
292         XCAM_LOG_WARNING ("VideoBufferInfo get_planar_info failed, unsupported format:%s", xcam_fourcc_to_string (buf_info->format));
293         return XCAM_RETURN_ERROR_PARAM;
294     }
295 
296     return XCAM_RETURN_NO_ERROR;
297 }
298