25 #ifndef FIREVISION_UTILS_COLOR_YUV_H_
26 #define FIREVISION_UTILS_COLOR_YUV_H_
28 namespace firevision {
30 #define YUV422PA_MACROPIXEL_AT(YUV, width, x, y) \
31 ((unsigned char *)YUV + (y) * (width)*2 + ((x) - ((x) % 2)) * 2)
33 #define YUV422_PLANAR_Y_AT(YUV, width, x, y) *(YUV + (y) * (width) + (x))
35 #define YUV422_PLANAR_U_AT(YUV, width, height, x, y) \
36 *(YUV + ((width) * (height)) + (((y) * (width) + (x)) / 2))
38 #define YUV422_PLANAR_V_AT(YUV, width, height, x, y) \
39 *(YUV + ((width) * (height)) + (((width) * (height) + (y) * (width) + (x)) / 2))
41 #define YUV422_PLANAR_YUV(YUV, width, height, x, y, yp, up, vp) \
43 yp = YUV422_PLANAR_Y_AT(YUV, width, x, y); \
44 up = YUV422_PLANAR_U_AT(YUV, width, height, x, y); \
45 vp = YUV422_PLANAR_V_AT(YUV, width, height, x, y); \
48 #define YUV422_PLANAR_U_PLANE(YUV, width, height) (YUV + (width) * (height))
49 #define YUV422_PLANAR_V_PLANE(YUV, width, height) \
50 (YUV + ((width) * (height)) + ((width) * (height) / 2))
52 #define YUV420_PLANAR_U_PLANE(YUV, width, height) (YUV + (width) * (height))
53 #define YUV420_PLANAR_V_PLANE(YUV, width, height) \
54 (YUV + ((width) * (height)) + ((width) * (height) / 4))
57 typedef struct YUV_t_struct
68 YUV_t_struct(
unsigned char y = 127,
unsigned char u = 127,
unsigned char v = 127)
133 void iyu1_to_yuy2(
const unsigned char *src,
134 unsigned char * dest,
136 unsigned int height);
141 void gray8_to_yuy2(
const unsigned char *src,
142 unsigned char * dest,
144 unsigned int height);
148 void gray8_to_yuv422planar_plainc(
const unsigned char *src,
151 unsigned int height);
152 void gray8_to_yuv422packed_plainc(
const unsigned char *src,
155 unsigned int height);
157 void yuv420planar_to_yuv422planar(
const unsigned char *src,
160 unsigned int height);
164 void yuv422planar_copy_uv(
const unsigned char *src,
170 unsigned int copy_width,
171 unsigned int copy_height);
175 void yuv422planar_to_yuv422packed(
const unsigned char *planar,
176 unsigned char * packed,
178 unsigned int height);
182 void yuv422planar_quarter_to_yuv422packed(
const unsigned char *planar,
183 unsigned char * packed,
184 const unsigned int width,
185 const unsigned int height);
188 void yuv422planar_quarter_to_yuv422planar(
const unsigned char *planar,
189 unsigned char * packed,
190 const unsigned int width,
191 const unsigned int height);
195 void yuv422packed_to_yuv422planar(
const unsigned char *packed,
196 unsigned char * planar,
198 unsigned int height);
202 void yuy2_to_yuv422planar(
const unsigned char *packed,
203 unsigned char * planar,
205 unsigned int height);
209 void yuy2_to_yuv422planar_quarter(
const unsigned char *packed,
210 unsigned char * planar,
211 const unsigned int width,
212 const unsigned int height);
216 void yvy2_to_yuv422planar(
const unsigned char *packed,
217 unsigned char * planar,
219 unsigned int height);
223 void yuv444packed_to_yuv422planar(
const unsigned char *yuv444,
224 unsigned char * yuv422,
226 unsigned int height);
228 void yuv444packed_to_yuv422packed(
const unsigned char *yuv444,
229 unsigned char * yuv422,
231 unsigned int height);
233 void yvu444packed_to_yuv422planar(
const unsigned char *yuv444,
234 unsigned char * yuv422,
236 unsigned int height);
238 void yvu444packed_to_yuv422packed(
const unsigned char *yuv444,
239 unsigned char * yuv422,
241 unsigned int height);
243 void yuv422planar_erase_y_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height);
245 void yuv422planar_erase_u_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height);
247 void yuv422planar_erase_v_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height);
249 void grayscale_yuv422packed(
const unsigned char *src,
252 unsigned int height);
254 void grayscale_yuv422planar(
const unsigned char *src,
257 unsigned int height);
260 convert_line_yuv422planar_to_yuv444packed(
const unsigned char *src,
264 unsigned int src_line,
265 unsigned int dst_line)
269 const unsigned char *yp, *up, *vp;
271 yp = src + (width * src_line);
272 up = YUV422_PLANAR_U_PLANE(src, width, height) + (width * src_line / 2);
273 vp = YUV422_PLANAR_V_PLANE(src, width, height) + (width * src_line / 2);
275 dst += 3 * width * dst_line;