--- trunk/xvidcore/src/image/colorspace.c 2006/10/30 10:52:00 1742 +++ trunk/xvidcore/src/image/colorspace.c 2009/05/13 09:39:20 1857 @@ -19,7 +19,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: colorspace.c,v 1.13 2006-10-30 10:52:00 Skal Exp $ + * $Id: colorspace.c,v 1.15 2009-05-13 09:39:20 Isibaar Exp $ * ****************************************************************************/ @@ -33,6 +33,7 @@ /* input */ packedFuncPtr rgb555_to_yv12; packedFuncPtr rgb565_to_yv12; +packedFuncPtr rgb_to_yv12; packedFuncPtr bgr_to_yv12; packedFuncPtr bgra_to_yv12; packedFuncPtr abgr_to_yv12; @@ -43,6 +44,7 @@ packedFuncPtr rgb555i_to_yv12; packedFuncPtr rgb565i_to_yv12; +packedFuncPtr rgbi_to_yv12; packedFuncPtr bgri_to_yv12; packedFuncPtr bgrai_to_yv12; packedFuncPtr abgri_to_yv12; @@ -57,6 +59,7 @@ packedFuncPtr yv12_to_bgr; packedFuncPtr yv12_to_bgra; packedFuncPtr yv12_to_abgr; +packedFuncPtr yv12_to_rgb; packedFuncPtr yv12_to_rgba; packedFuncPtr yv12_to_argb; packedFuncPtr yv12_to_yuyv; @@ -67,6 +70,7 @@ packedFuncPtr yv12_to_bgri; packedFuncPtr yv12_to_bgrai; packedFuncPtr yv12_to_abgri; +packedFuncPtr yv12_to_rgbi; packedFuncPtr yv12_to_rgbai; packedFuncPtr yv12_to_argbi; packedFuncPtr yv12_to_yuyvi; @@ -148,9 +152,9 @@ #define V_B_IN 0.071 #define V_ADD_IN 128 -#define SCALEBITS_IN 8 +#define SCALEBITS_IN 13 #define FIX_IN(x) ((uint16_t) ((x) * (1L<> SCALEBITS_IN) + Y_ADD_IN; \ + FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2); \ b##UVID += b = C1##_B(rgb); \ g##UVID += g = C1##_G(rgb); \ r##UVID += r = C1##_R(rgb); \ y_ptr[(ROW)*y_stride+1] = \ (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ - FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; + FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; #define READ_RGB16_UV(UV_ROW,UVID) \ u_ptr[(UV_ROW)*uv_stride] = \ (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ - 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; \ v_ptr[(UV_ROW)*uv_stride] = \ (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ - 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; #define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ /* nothing */ @@ -218,21 +222,21 @@ b##UVID += b = x_ptr[(ROW)*x_stride+(C3)]; \ y_ptr[(ROW)*y_stride+0] = \ (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ - FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; \ + FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)]; \ g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)]; \ b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)]; \ y_ptr[(ROW)*y_stride+1] = \ (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ - FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; + FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; #define READ_RGB_UV(UV_ROW,UVID) \ u_ptr[(UV_ROW)*uv_stride] = \ (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ - 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; \ v_ptr[(UV_ROW)*uv_stride] = \ (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ - 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; #define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ @@ -288,6 +292,7 @@ MAKE_COLORSPACE(rgb565_to_yv12_c, 2,2,2, RGB16_TO_YV12, MK_RGB565, 0,0,0) MAKE_COLORSPACE(bgr_to_yv12_c, 3,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) +MAKE_COLORSPACE(rgb_to_yv12_c, 3,2,2, RGB_TO_YV12, 0,1,2, 0) MAKE_COLORSPACE(abgr_to_yv12_c, 4,2,2, RGB_TO_YV12, 3,2,1, 0) MAKE_COLORSPACE(rgba_to_yv12_c, 4,2,2, RGB_TO_YV12, 0,1,2, 0) MAKE_COLORSPACE(argb_to_yv12_c, 4,2,2, RGB_TO_YV12, 1,2,3, 0) @@ -299,6 +304,7 @@ MAKE_COLORSPACE(bgri_to_yv12_c, 3,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) MAKE_COLORSPACE(abgri_to_yv12_c, 4,2,4, RGBI_TO_YV12, 3,2,1, 0) +MAKE_COLORSPACE(rgbi_to_yv12_c, 3,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) MAKE_COLORSPACE(argbi_to_yv12_c, 4,2,4, RGBI_TO_YV12, 1,2,3, 0) MAKE_COLORSPACE(yuyvi_to_yv12_c, 2,2,4, YUYVI_TO_YV12, 0,1,2,3) @@ -320,7 +326,7 @@ #define R_V_OUT 1.596 #define V_ADD_OUT 128 -#define SCALEBITS_OUT 13 +#define SCALEBITS_OUT 13 #define FIX_OUT(x) ((uint16_t) ((x) * (1L<