读书人

i420 转 rgb24 模式1:1:1,该怎么解决

发布时间: 2012-04-13 13:50:24 作者: rapoo

i420 转 rgb24 模式1:1:1
谁有这个函数或方法,麻烦分享下,谢谢。 我试了用yv12转rgb24的函数位置,看是否有图像出来,但发现,显示出来是黑屏,是因为解析格式不对,还是拿来的数据有问题(第三方数据)?

开发平台 gtk c

C/C++ code
{ //函数1 yv12_to_rgb24(pBuf,rgb_buf,pFrameInfo->nWidth,pFrameInfo->nHeight); //pBuf为i420的数据      gdk_draw_rgb_image (drawingarea->window, drawingarea->style->fg_gc[GTK_STATE_NORMAL],                    0, 0, pFrameInfo->nWidth, pFrameInfo->nHeight,                        GDK_RGB_DITHER_MAX, rgb_buf, sizeof(rgb_buf)); }//函数1#define YUV2RGB(y, u, v, r, g, b)\r = y + ((v*1436) >>10);\g = y - ((u*352 + v*731) >> 10);\b = y + ((u*1814) >> 10);\r = r < 0 ? 0 : r;\g = g < 0 ? 0 : g;\b = b < 0 ? 0 : b;\r = r > 255 ? 255 : r;\g = g > 255 ? 255 : g;\b = b > 255 ? 255 : b//调用的void yv12_to_rgb24 (unsigned char *src, unsigned char *dest, int width, int height){register int i,j;register int y0, y1, u, v;register int r, g, b;register unsigned char *s[3];s[0] = src;s[1] = s[0] + width*height;s[2] = s[1] + width*height/4;for (i = 0; i < height; i++) {for (j = 0; j < width; j++) {      y0 = *(s[0])++;      y1 = *(s[0])++;      if (i % 2 == 0 ) {        u = *(s[1])++ - 128;        v = *(s[2])++ - 128;      }         YUV2RGB (y0, u, v, r, g, b);      *dest++ = r;      *dest++ = g;      *dest++ = b;      YUV2RGB (y1, u, v, r, g, b);      *dest++ = r;      *dest++ = g;      *dest++ = b;    }}}                  


[解决办法]
i步长是2.
另外奇怪的是就算稍微有点偏差也不至于是全黑的。

如果确信是I420的应该是问题不大的,否则UV颠倒一下试试 。

最后检查一下 YUV2RGB 是否正确。
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

在最后直接看输入的图是否是黑色的。

共享的函数的话就木有了,没写过....

读书人网 >C语言

热点推荐