1 |
/************************************************************************** |
/***************************************************************************** |
2 |
* |
* |
3 |
* XVID MPEG-4 VIDEO CODEC |
* XVID MPEG-4 VIDEO CODEC |
4 |
* colorspace conversions |
* - Colorspace conversion functions - |
5 |
|
* |
6 |
|
* Copyright(C) 2001-2003 Peter Ross <pross@xvid.org> |
7 |
* |
* |
8 |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
9 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
17 |
* |
* |
18 |
* You should have received a copy of the GNU General Public License |
* You should have received a copy of the GNU General Public License |
19 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
20 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
* |
|
|
*************************************************************************/ |
|
|
|
|
|
/************************************************************************** |
|
|
* |
|
|
* History: |
|
21 |
* |
* |
22 |
* 14.04.2002 added user_to_yuv_c() |
* $Id$ |
|
* 30.02.2002 out_yuv dst_stride2 fix |
|
|
* 26.02.2002 rgb555, rgb565 |
|
|
* 24.11.2001 accuracy improvement to yuyv/vyuy conversion |
|
|
* 28.10.2001 total rewrite <pross@cs.rmit.edu.au> |
|
23 |
* |
* |
24 |
**************************************************************************/ |
****************************************************************************/ |
25 |
|
|
26 |
#include <string.h> // memcpy |
#include <string.h> /* memcpy */ |
27 |
|
|
28 |
#include "../global.h" |
#include "../global.h" |
|
#include "../divx4.h" // DEC_PICTURE |
|
29 |
#include "colorspace.h" |
#include "colorspace.h" |
30 |
|
|
31 |
// function pointers |
/* function pointers */ |
32 |
|
|
33 |
/* input */ |
/* input */ |
34 |
packedFuncPtr rgb555_to_yv12; |
packedFuncPtr rgb555_to_yv12; |
35 |
packedFuncPtr rgb565_to_yv12; |
packedFuncPtr rgb565_to_yv12; |
36 |
|
packedFuncPtr rgb_to_yv12; |
37 |
packedFuncPtr bgr_to_yv12; |
packedFuncPtr bgr_to_yv12; |
38 |
packedFuncPtr bgra_to_yv12; |
packedFuncPtr bgra_to_yv12; |
39 |
packedFuncPtr abgr_to_yv12; |
packedFuncPtr abgr_to_yv12; |
40 |
packedFuncPtr rgba_to_yv12; |
packedFuncPtr rgba_to_yv12; |
41 |
packedFuncPtr yuv_to_yv12; |
packedFuncPtr argb_to_yv12; |
42 |
packedFuncPtr yuyv_to_yv12; |
packedFuncPtr yuyv_to_yv12; |
43 |
packedFuncPtr uyvy_to_yv12; |
packedFuncPtr uyvy_to_yv12; |
44 |
|
|
45 |
packedFuncPtr rgb555i_to_yv12; |
packedFuncPtr rgb555i_to_yv12; |
46 |
packedFuncPtr rgb565i_to_yv12; |
packedFuncPtr rgb565i_to_yv12; |
47 |
|
packedFuncPtr rgbi_to_yv12; |
48 |
packedFuncPtr bgri_to_yv12; |
packedFuncPtr bgri_to_yv12; |
49 |
packedFuncPtr bgrai_to_yv12; |
packedFuncPtr bgrai_to_yv12; |
50 |
packedFuncPtr abgri_to_yv12; |
packedFuncPtr abgri_to_yv12; |
51 |
packedFuncPtr rgbai_to_yv12; |
packedFuncPtr rgbai_to_yv12; |
52 |
|
packedFuncPtr argbi_to_yv12; |
53 |
packedFuncPtr yuyvi_to_yv12; |
packedFuncPtr yuyvi_to_yv12; |
54 |
packedFuncPtr uyvyi_to_yv12; |
packedFuncPtr uyvyi_to_yv12; |
55 |
|
|
59 |
packedFuncPtr yv12_to_bgr; |
packedFuncPtr yv12_to_bgr; |
60 |
packedFuncPtr yv12_to_bgra; |
packedFuncPtr yv12_to_bgra; |
61 |
packedFuncPtr yv12_to_abgr; |
packedFuncPtr yv12_to_abgr; |
62 |
|
packedFuncPtr yv12_to_rgb; |
63 |
packedFuncPtr yv12_to_rgba; |
packedFuncPtr yv12_to_rgba; |
64 |
packedFuncPtr yv12_to_yuv; |
packedFuncPtr yv12_to_argb; |
65 |
packedFuncPtr yv12_to_yuyv; |
packedFuncPtr yv12_to_yuyv; |
66 |
packedFuncPtr yv12_to_uyvy; |
packedFuncPtr yv12_to_uyvy; |
67 |
|
|
70 |
packedFuncPtr yv12_to_bgri; |
packedFuncPtr yv12_to_bgri; |
71 |
packedFuncPtr yv12_to_bgrai; |
packedFuncPtr yv12_to_bgrai; |
72 |
packedFuncPtr yv12_to_abgri; |
packedFuncPtr yv12_to_abgri; |
73 |
|
packedFuncPtr yv12_to_rgbi; |
74 |
packedFuncPtr yv12_to_rgbai; |
packedFuncPtr yv12_to_rgbai; |
75 |
|
packedFuncPtr yv12_to_argbi; |
76 |
packedFuncPtr yv12_to_yuyvi; |
packedFuncPtr yv12_to_yuyvi; |
77 |
packedFuncPtr yv12_to_uyvyi; |
packedFuncPtr yv12_to_uyvyi; |
78 |
|
|
79 |
planarFuncPtr yv12_to_yv12; |
planarFuncPtr yv12_to_yv12; |
80 |
|
|
81 |
|
|
82 |
int32_t RGB_Y_tab[256]; |
static int32_t RGB_Y_tab[256]; |
83 |
int32_t B_U_tab[256]; |
static int32_t B_U_tab[256]; |
84 |
int32_t G_U_tab[256]; |
static int32_t G_U_tab[256]; |
85 |
int32_t G_V_tab[256]; |
static int32_t G_V_tab[256]; |
86 |
int32_t R_V_tab[256]; |
static int32_t R_V_tab[256]; |
87 |
|
|
88 |
|
|
89 |
|
|
152 |
#define V_B_IN 0.071 |
#define V_B_IN 0.071 |
153 |
#define V_ADD_IN 128 |
#define V_ADD_IN 128 |
154 |
|
|
155 |
#define SCALEBITS_IN 8 |
#define SCALEBITS_IN 13 |
156 |
#define FIX_IN(x) ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5)) |
#define FIX_IN(x) ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5)) |
157 |
|
#define FIX_ROUND (1L<<(SCALEBITS_IN-1)) |
158 |
|
|
159 |
/* rgb16/rgb16i input */ |
/* rgb16/rgb16i input */ |
160 |
|
|
174 |
r##UVID += r = C1##_R(rgb); \ |
r##UVID += r = C1##_R(rgb); \ |
175 |
y_ptr[(ROW)*y_stride+0] = \ |
y_ptr[(ROW)*y_stride+0] = \ |
176 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
177 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; \ |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ |
178 |
rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2); \ |
rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2); \ |
179 |
b##UVID += b = C1##_B(rgb); \ |
b##UVID += b = C1##_B(rgb); \ |
180 |
g##UVID += g = C1##_G(rgb); \ |
g##UVID += g = C1##_G(rgb); \ |
181 |
r##UVID += r = C1##_R(rgb); \ |
r##UVID += r = C1##_R(rgb); \ |
182 |
y_ptr[(ROW)*y_stride+1] = \ |
y_ptr[(ROW)*y_stride+1] = \ |
183 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
184 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; |
185 |
|
|
186 |
#define READ_RGB16_UV(UV_ROW,UVID) \ |
#define READ_RGB16_UV(UV_ROW,UVID) \ |
187 |
u_ptr[(UV_ROW)*uv_stride] = \ |
u_ptr[(UV_ROW)*uv_stride] = \ |
188 |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
189 |
FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
190 |
v_ptr[(UV_ROW)*uv_stride] = \ |
v_ptr[(UV_ROW)*uv_stride] = \ |
191 |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
192 |
FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
193 |
|
|
194 |
#define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
#define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
195 |
/* nothing */ |
/* nothing */ |
222 |
b##UVID += b = x_ptr[(ROW)*x_stride+(C3)]; \ |
b##UVID += b = x_ptr[(ROW)*x_stride+(C3)]; \ |
223 |
y_ptr[(ROW)*y_stride+0] = \ |
y_ptr[(ROW)*y_stride+0] = \ |
224 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
225 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; \ |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ |
226 |
r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)]; \ |
r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)]; \ |
227 |
g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)]; \ |
g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)]; \ |
228 |
b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)]; \ |
b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)]; \ |
229 |
y_ptr[(ROW)*y_stride+1] = \ |
y_ptr[(ROW)*y_stride+1] = \ |
230 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
231 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; |
232 |
|
|
233 |
#define READ_RGB_UV(UV_ROW,UVID) \ |
#define READ_RGB_UV(UV_ROW,UVID) \ |
234 |
u_ptr[(UV_ROW)*uv_stride] = \ |
u_ptr[(UV_ROW)*uv_stride] = \ |
235 |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
236 |
FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
237 |
v_ptr[(UV_ROW)*uv_stride] = \ |
v_ptr[(UV_ROW)*uv_stride] = \ |
238 |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
239 |
FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
240 |
|
|
241 |
|
|
242 |
#define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
#define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
292 |
MAKE_COLORSPACE(rgb565_to_yv12_c, 2,2,2, RGB16_TO_YV12, MK_RGB565, 0,0,0) |
MAKE_COLORSPACE(rgb565_to_yv12_c, 2,2,2, RGB16_TO_YV12, MK_RGB565, 0,0,0) |
293 |
MAKE_COLORSPACE(bgr_to_yv12_c, 3,2,2, RGB_TO_YV12, 2,1,0, 0) |
MAKE_COLORSPACE(bgr_to_yv12_c, 3,2,2, RGB_TO_YV12, 2,1,0, 0) |
294 |
MAKE_COLORSPACE(bgra_to_yv12_c, 4,2,2, RGB_TO_YV12, 2,1,0, 0) |
MAKE_COLORSPACE(bgra_to_yv12_c, 4,2,2, RGB_TO_YV12, 2,1,0, 0) |
295 |
|
MAKE_COLORSPACE(rgb_to_yv12_c, 3,2,2, RGB_TO_YV12, 0,1,2, 0) |
296 |
MAKE_COLORSPACE(abgr_to_yv12_c, 4,2,2, RGB_TO_YV12, 3,2,1, 0) |
MAKE_COLORSPACE(abgr_to_yv12_c, 4,2,2, RGB_TO_YV12, 3,2,1, 0) |
297 |
MAKE_COLORSPACE(rgba_to_yv12_c, 4,2,2, RGB_TO_YV12, 0,1,2, 0) |
MAKE_COLORSPACE(rgba_to_yv12_c, 4,2,2, RGB_TO_YV12, 0,1,2, 0) |
298 |
|
MAKE_COLORSPACE(argb_to_yv12_c, 4,2,2, RGB_TO_YV12, 1,2,3, 0) |
299 |
MAKE_COLORSPACE(yuyv_to_yv12_c, 2,2,2, YUYV_TO_YV12, 0,1,2,3) |
MAKE_COLORSPACE(yuyv_to_yv12_c, 2,2,2, YUYV_TO_YV12, 0,1,2,3) |
300 |
MAKE_COLORSPACE(uyvy_to_yv12_c, 2,2,2, YUYV_TO_YV12, 1,0,3,2) |
MAKE_COLORSPACE(uyvy_to_yv12_c, 2,2,2, YUYV_TO_YV12, 1,0,3,2) |
301 |
|
|
304 |
MAKE_COLORSPACE(bgri_to_yv12_c, 3,2,4, RGBI_TO_YV12, 2,1,0, 0) |
MAKE_COLORSPACE(bgri_to_yv12_c, 3,2,4, RGBI_TO_YV12, 2,1,0, 0) |
305 |
MAKE_COLORSPACE(bgrai_to_yv12_c, 4,2,4, RGBI_TO_YV12, 2,1,0, 0) |
MAKE_COLORSPACE(bgrai_to_yv12_c, 4,2,4, RGBI_TO_YV12, 2,1,0, 0) |
306 |
MAKE_COLORSPACE(abgri_to_yv12_c, 4,2,4, RGBI_TO_YV12, 3,2,1, 0) |
MAKE_COLORSPACE(abgri_to_yv12_c, 4,2,4, RGBI_TO_YV12, 3,2,1, 0) |
307 |
|
MAKE_COLORSPACE(rgbi_to_yv12_c, 3,2,4, RGBI_TO_YV12, 0,1,2, 0) |
308 |
MAKE_COLORSPACE(rgbai_to_yv12_c, 4,2,4, RGBI_TO_YV12, 0,1,2, 0) |
MAKE_COLORSPACE(rgbai_to_yv12_c, 4,2,4, RGBI_TO_YV12, 0,1,2, 0) |
309 |
|
MAKE_COLORSPACE(argbi_to_yv12_c, 4,2,4, RGBI_TO_YV12, 1,2,3, 0) |
310 |
MAKE_COLORSPACE(yuyvi_to_yv12_c, 2,2,4, YUYVI_TO_YV12, 0,1,2,3) |
MAKE_COLORSPACE(yuyvi_to_yv12_c, 2,2,4, YUYVI_TO_YV12, 0,1,2,3) |
311 |
MAKE_COLORSPACE(uyvyi_to_yv12_c, 2,2,4, YUYVI_TO_YV12, 1,0,3,2) |
MAKE_COLORSPACE(uyvyi_to_yv12_c, 2,2,4, YUYVI_TO_YV12, 1,0,3,2) |
312 |
|
|
343 |
((MAX(0,MIN(255, B)) >> 3) & 0x001f) |
((MAX(0,MIN(255, B)) >> 3) & 0x001f) |
344 |
|
|
345 |
#define WRITE_RGB16(ROW,UV_ROW,C1) \ |
#define WRITE_RGB16(ROW,UV_ROW,C1) \ |
346 |
rgb_y = RGB_Y_tab[ y_ptr[y_stride + 0] ]; \ |
rgb_y = RGB_Y_tab[ y_ptr[y_stride*(ROW) + 0] ]; \ |
347 |
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT); \ |
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT); \ |
348 |
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT); \ |
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT); \ |
349 |
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT); \ |
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT); \ |
350 |
*(uint16_t *) (x_ptr+((ROW)*x_stride)+0) = C1(r[ROW], g[ROW], b[ROW]); \ |
*(uint16_t *) (x_ptr+((ROW)*x_stride)+0) = C1(r[ROW], g[ROW], b[ROW]); \ |
351 |
rgb_y = RGB_Y_tab[ y_ptr[y_stride + 1] ]; \ |
rgb_y = RGB_Y_tab[ y_ptr[y_stride*(ROW) + 1] ]; \ |
352 |
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT); \ |
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u##UV_ROW) >> SCALEBITS_OUT); \ |
353 |
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT); \ |
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv##UV_ROW) >> SCALEBITS_OUT); \ |
354 |
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT); \ |
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v##UV_ROW) >> SCALEBITS_OUT); \ |
449 |
MAKE_COLORSPACE(yv12_to_bgr_c, 3,2,2, YV12_TO_RGB, 2,1,0, 0) |
MAKE_COLORSPACE(yv12_to_bgr_c, 3,2,2, YV12_TO_RGB, 2,1,0, 0) |
450 |
MAKE_COLORSPACE(yv12_to_bgra_c, 4,2,2, YV12_TO_RGB, 2,1,0,3) |
MAKE_COLORSPACE(yv12_to_bgra_c, 4,2,2, YV12_TO_RGB, 2,1,0,3) |
451 |
MAKE_COLORSPACE(yv12_to_abgr_c, 4,2,2, YV12_TO_RGB, 3,2,1,0) |
MAKE_COLORSPACE(yv12_to_abgr_c, 4,2,2, YV12_TO_RGB, 3,2,1,0) |
452 |
|
MAKE_COLORSPACE(yv12_to_rgb_c, 3,2,2, YV12_TO_RGB, 0,1,2,0) |
453 |
MAKE_COLORSPACE(yv12_to_rgba_c, 4,2,2, YV12_TO_RGB, 0,1,2,3) |
MAKE_COLORSPACE(yv12_to_rgba_c, 4,2,2, YV12_TO_RGB, 0,1,2,3) |
454 |
|
MAKE_COLORSPACE(yv12_to_argb_c, 4,2,2, YV12_TO_RGB, 1,2,3,0) |
455 |
MAKE_COLORSPACE(yv12_to_yuyv_c, 2,2,2, YV12_TO_YUYV, 0,1,2,3) |
MAKE_COLORSPACE(yv12_to_yuyv_c, 2,2,2, YV12_TO_YUYV, 0,1,2,3) |
456 |
MAKE_COLORSPACE(yv12_to_uyvy_c, 2,2,2, YV12_TO_YUYV, 1,0,3,2) |
MAKE_COLORSPACE(yv12_to_uyvy_c, 2,2,2, YV12_TO_YUYV, 1,0,3,2) |
457 |
|
|
460 |
MAKE_COLORSPACE(yv12_to_bgri_c, 3,2,4, YV12_TO_RGBI, 2,1,0, 0) |
MAKE_COLORSPACE(yv12_to_bgri_c, 3,2,4, YV12_TO_RGBI, 2,1,0, 0) |
461 |
MAKE_COLORSPACE(yv12_to_bgrai_c, 4,2,4, YV12_TO_RGBI, 2,1,0,3) |
MAKE_COLORSPACE(yv12_to_bgrai_c, 4,2,4, YV12_TO_RGBI, 2,1,0,3) |
462 |
MAKE_COLORSPACE(yv12_to_abgri_c, 4,2,4, YV12_TO_RGBI, 3,2,1,0) |
MAKE_COLORSPACE(yv12_to_abgri_c, 4,2,4, YV12_TO_RGBI, 3,2,1,0) |
463 |
|
MAKE_COLORSPACE(yv12_to_rgbi_c, 3,2,4, YV12_TO_RGBI, 0,1,2,0) |
464 |
MAKE_COLORSPACE(yv12_to_rgbai_c, 4,2,4, YV12_TO_RGBI, 0,1,2,3) |
MAKE_COLORSPACE(yv12_to_rgbai_c, 4,2,4, YV12_TO_RGBI, 0,1,2,3) |
465 |
|
MAKE_COLORSPACE(yv12_to_argbi_c, 4,2,4, YV12_TO_RGBI, 1,2,3,0) |
466 |
MAKE_COLORSPACE(yv12_to_yuyvi_c, 2,2,4, YV12_TO_YUYVI, 0,1,2,3) |
MAKE_COLORSPACE(yv12_to_yuyvi_c, 2,2,4, YV12_TO_YUYVI, 0,1,2,3) |
467 |
MAKE_COLORSPACE(yv12_to_uyvyi_c, 2,2,4, YV12_TO_YUYVI, 1,0,3,2) |
MAKE_COLORSPACE(yv12_to_uyvyi_c, 2,2,4, YV12_TO_YUYVI, 1,0,3,2) |
468 |
|
|
480 |
int width2 = width / 2; |
int width2 = width / 2; |
481 |
int height2 = height / 2; |
int height2 = height / 2; |
482 |
int y; |
int y; |
483 |
|
const int with_uv = (u_src!=0 && v_src!=0); |
484 |
|
|
485 |
if (vflip) { |
if (vflip) { |
486 |
y_src += (height - 1) * y_src_stride; |
y_src += (height - 1) * y_src_stride; |
487 |
|
if (with_uv) { |
488 |
u_src += (height2 - 1) * uv_src_stride; |
u_src += (height2 - 1) * uv_src_stride; |
489 |
v_src += (height2 - 1) * uv_src_stride; |
v_src += (height2 - 1) * uv_src_stride; |
490 |
|
} |
491 |
y_src_stride = -y_src_stride; |
y_src_stride = -y_src_stride; |
492 |
uv_src_stride = -uv_src_stride; |
uv_src_stride = -uv_src_stride; |
493 |
} |
} |
498 |
y_dst += y_dst_stride; |
y_dst += y_dst_stride; |
499 |
} |
} |
500 |
|
|
501 |
|
if (with_uv) { |
502 |
for (y = height2; y; y--) { |
for (y = height2; y; y--) { |
503 |
memcpy(u_dst, u_src, width2); |
memcpy(u_dst, u_src, width2); |
504 |
|
memcpy(v_dst, v_src, width2); |
505 |
u_src += uv_src_stride; |
u_src += uv_src_stride; |
506 |
u_dst += uv_dst_stride; |
u_dst += uv_dst_stride; |
507 |
|
v_src += uv_src_stride; |
508 |
|
v_dst += uv_dst_stride; |
509 |
} |
} |
510 |
|
} |
511 |
|
else { |
512 |
for (y = height2; y; y--) { |
for (y = height2; y; y--) { |
513 |
memcpy(v_dst, v_src, width2); |
memset(u_dst, 0x80, width2); |
514 |
v_src += uv_src_stride; |
memset(v_dst, 0x80, width2); |
515 |
|
u_dst += uv_dst_stride; |
516 |
v_dst += uv_dst_stride; |
v_dst += uv_dst_stride; |
517 |
} |
} |
518 |
} |
} |
519 |
|
} |
520 |
|
|
521 |
|
|
522 |
|
|