YV12转RGB24(按公式转,没有任何优化)

void
yv12_to_rgb565_c2(int32_t * t_ptr, uint8_t * x_ptr,uint8_t * y_ptr)
{
int x, y;

uint8_t * u_ptr = y_ptr + 176672;
uint8_t * v_ptr = u_ptr + 49984;


for (y = 0; y < 288; y+=2)
{
   int r[2], g[2], b[2];
   r[0] = r[1] = g[0] = g[1] = b[0] = b[1] = 0;
for (x = 0; x < 352; x+=2)
{
int rgb_y; 
int b_u0 = B_U_tab[ u_ptr[0] ];
int g_uv0 = G_U_tab[ u_ptr[0] ] + G_V_tab[ v_ptr[0] ];
int r_v0 = R_V_tab[ v_ptr[0] ];

rgb_y = RGB_Y_tab[ y_ptr[0] ];
b[0] = (b[0] & 0x7) + ((rgb_y + b_u0) >> SCALEBITS_OUT);
g[0] = (g[0] & 0x7) + ((rgb_y - g_uv0) >> SCALEBITS_OUT);
r[0] = (r[0] & 0x7) + ((rgb_y + r_v0) >> SCALEBITS_OUT);
*(uint16_t *) x_ptr =  MK_RGB565(r[0], g[0], b[0]);
rgb_y = RGB_Y_tab[ y_ptr[1] ];
b[0] = (b[0] & 0x7) + ((rgb_y + b_u0) >> SCALEBITS_OUT);
g[0] = (g[0] & 0x7) + ((rgb_y - g_uv0) >> SCALEBITS_OUT);
r[0] = (r[0] & 0x7) + ((rgb_y + r_v0) >> SCALEBITS_OUT);
*(uint16_t *) (x_ptr+2) = MK_RGB565(r[0], g[0], b[0]);

rgb_y = RGB_Y_tab[ y_ptr[480] ];
b[1] = (b[1] & 0x7) + ((rgb_y + b_u0) >> SCALEBITS_OUT);
g[1] = (g[1] & 0x7) + ((rgb_y - g_uv0) >> SCALEBITS_OUT);
r[1] = (r[1] & 0x7) + ((rgb_y + r_v0) >> SCALEBITS_OUT);
*(uint16_t *) (x_ptr+704) =  MK_RGB565(r[1], g[1], b[1]);
rgb_y = RGB_Y_tab[ y_ptr[481] ];
b[1] = (b[1] & 0x7) + ((rgb_y + b_u0) >> SCALEBITS_OUT);
g[1] = (g[1] & 0x7) + ((rgb_y - g_uv0) >> SCALEBITS_OUT);
r[1] = (r[1] & 0x7) + ((rgb_y + r_v0) >> SCALEBITS_OUT);
*(uint16_t *) (x_ptr+704+2)=  MK_RGB565(r[1], g[1], b[1]);

x_ptr += 4;
y_ptr += 2;
u_ptr += 1;
v_ptr += 1;
}
x_ptr += 352*2;    //704;
// x_ptr += 1600+1600 - 352*2;
y_ptr += 608;      //608; //128 + 480;
u_ptr += 64 ;  //64;
v_ptr += 64; //64;
}
}
posted on 2012-02-11 16:22  carekee  阅读(665)  评论(0编辑  收藏  举报