首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

I420转RGB24 麻烦看下代码,多谢

2012-04-22 
I420转RGB24麻烦看下代码,谢谢急C/C++ code#define uint8_tunsigned char#define int8_tsigned char#defin

I420转RGB24 麻烦看下代码,谢谢 急

C/C++ code
#define uint8_t        unsigned char#define int8_t        signed char#define uint16_t    unsigned short#define int16_t        signed short#define uint32_t    unsigned int#define int32_t        signed int#define RGB_Y_OUT        1.164#define B_U_OUT            2.018#define Y_ADD_OUT        16#define G_U_OUT            0.391#define G_V_OUT            0.813#define U_ADD_OUT        128#define R_V_OUT            1.596#define V_ADD_OUT        128#define SCALEBITS_OUT    13#define FIX_OUT(x)        ((uint16_t) ((x) * (1L<<SCALEBITS_OUT) + 0.5))int32_t RGB_Y_tab[256];int32_t B_U_tab[256];int32_t G_U_tab[256];int32_t G_V_tab[256];int32_t R_V_tab[256];#define MAX(a,b) ((a) > (b) ? (a) : (b))#define MIN(a,b) ((a) > (b) ? (b) : (a))void colorspace_init(void) {    int32_t i;    for(i = 0; i < 256; i++) {        RGB_Y_tab[i] = FIX_OUT(RGB_Y_OUT) * (i - Y_ADD_OUT);        B_U_tab[i] = FIX_OUT(B_U_OUT) * (i - U_ADD_OUT);        G_U_tab[i] = FIX_OUT(G_U_OUT) * (i - U_ADD_OUT);        G_V_tab[i] = FIX_OUT(G_V_OUT) * (i - V_ADD_OUT);        R_V_tab[i] = FIX_OUT(R_V_OUT) * (i - V_ADD_OUT);    }}unsigned char  str_tmp[2000*3];void yv12_to_rgb24_c(uint8_t *dst, int dst_stride,    uint8_t *y_src, uint8_t *u_src, uint8_t * v_src,    int y_stride, int uv_stride,    int width, int height){    static int iFlag = 0;    if (iFlag == 0)    {        colorspace_init();        iFlag = 1;    }    unsigned char* pDest = dst;    const uint32_t dst_dif = 6 * dst_stride - 3 * width;    int32_t y_dif = 2 * y_stride - width;    uint8_t *dst2 = dst + 3 * dst_stride;    const uint8_t *y_src2 = y_src + y_stride;    uint32_t x, y;    if (height < 0) { // flip image?        height = -height;        y_src += (height - 1) * y_stride;        y_src2 = y_src - y_stride;        u_src += (height / 2 - 1) * uv_stride;        v_src += (height / 2 - 1) * uv_stride;        y_dif = -width - 2 * y_stride;        uv_stride = -uv_stride;    }    for (y = height / 2; y; y--)     {        // process one 2x2 block per iteration        for (x = 0; x < (uint32_t)width / 2; x++)        {            int u, v;            int b_u, g_uv, r_v, rgb_y;            int r, g, b;            u = u_src[x];            v = v_src[x];            b_u = B_U_tab[u];            g_uv = G_U_tab[u] + G_V_tab[v];            r_v = R_V_tab[v];            rgb_y = RGB_Y_tab[*y_src];            b = (rgb_y + b_u) >> SCALEBITS_OUT;            g = (rgb_y - g_uv) >> SCALEBITS_OUT;            r = (rgb_y + r_v) >> SCALEBITS_OUT;            dst[0] = MAX(0,MIN(255, b));            dst[1] = MAX(0,MIN(255, g));            dst[2] = MAX(0,MIN(255, r));            y_src++;            rgb_y = RGB_Y_tab[*y_src];            b = (rgb_y + b_u) >> SCALEBITS_OUT;            g = (rgb_y - g_uv) >> SCALEBITS_OUT;            r = (rgb_y + r_v) >> SCALEBITS_OUT;            dst[3] = MAX(0,MIN(255, b));            dst[4] = MAX(0,MIN(255, g));            dst[5] = MAX(0,MIN(255, r));            y_src++;            rgb_y = RGB_Y_tab[*y_src2];            b = (rgb_y + b_u) >> SCALEBITS_OUT;            g = (rgb_y - g_uv) >> SCALEBITS_OUT;            r = (rgb_y + r_v) >> SCALEBITS_OUT;            dst2[0] = MAX(0,MIN(255, b));            dst2[1] = MAX(0,MIN(255, g));            dst2[2] = MAX(0,MIN(255, r));            y_src2++;            rgb_y = RGB_Y_tab[*y_src2];            b = (rgb_y + b_u) >> SCALEBITS_OUT;            g = (rgb_y - g_uv) >> SCALEBITS_OUT;            r = (rgb_y + r_v) >> SCALEBITS_OUT;            dst2[3] = MAX(0,MIN(255, b));            dst2[4] = MAX(0,MIN(255, g));            dst2[5] = MAX(0,MIN(255, r));            y_src2++;            dst += 6;            dst2 += 6;        }        dst += dst_dif;        dst2 += dst_dif;        y_src += y_dif;        y_src2 += y_dif;        u_src += uv_stride;        v_src += uv_stride;    }    for (int i = 0; i < height/2; i++)    {        memcpy(str_tmp, pDest + i*width*3, width*3);        memcpy(pDest+i*width*3, pDest+(height-i-1)*width*3, width*3);        memcpy(pDest+(height-1-i)*width*3, str_tmp, width*3);    }}void yv12_rgb24(unsigned char* pBmpBuf,unsigned char* pDataBuf, long nWidth, long nHeight){    unsigned char *YBuf, *UBuf, *VBuf ;  //?æ·ÅY¡¢U¡¢VÖµµÄ»º³åÇø    YBuf = pDataBuf ;    UBuf = pDataBuf + nWidth * nHeight ;    VBuf = pDataBuf + nWidth * nHeight * 5 / 4 ;     yv12_to_rgb24_c(pBmpBuf , nWidth , YBuf , UBuf , VBuf, nWidth , nWidth/2, nWidth YBuf/ 



[解决办法]
帮顶,没看出啥问题...
[解决办法]
什么错误?

热点排行
Bad Request.