急求RGB565转YUV420的算法解决思路
急求RGB565转YUV420的算法
急求RGB565转YUV420的算法, 有代码就最好了, 谢谢!
我在directshow采集视频时取出来的是RGB565, 现在想转换成YUV42O, 我在网上找到了一下只有YUV420转RGB565的
------解决方案--------------------
别让哥削你,xvid。
------解决方案--------------------
http://download.****.net/source/3348196
尝试怎么用,我不写 demo 了,
------解决方案--------------------
YUV与RGB格式的互转资料,可以参考http://www.fourcc.org/fccyvrgb.php
------解决方案--------------------
可以用ffmpeg转换。
ffmpeg的效率很高。
------解决方案--------------------
你编译完 colorspace 以后,有个 colorspace.lib 的静态库 和 colorspace.h
colorspace.h 里是 colorspace 支持的转换,如
急求RGB565转YUV420的算法, 有代码就最好了, 谢谢!
我在directshow采集视频时取出来的是RGB565, 现在想转换成YUV42O, 我在网上找到了一下只有YUV420转RGB565的
------解决方案--------------------
别让哥削你,xvid。
------解决方案--------------------
http://download.****.net/source/3348196
尝试怎么用,我不写 demo 了,
------解决方案--------------------
YUV与RGB格式的互转资料,可以参考http://www.fourcc.org/fccyvrgb.php
------解决方案--------------------
可以用ffmpeg转换。
ffmpeg的效率很高。
------解决方案--------------------
你编译完 colorspace 以后,有个 colorspace.lib 的静态库 和 colorspace.h
colorspace.h 里是 colorspace 支持的转换,如
- C/C++ code
packedFunc rgb555_to_yv12_c; packedFunc rgb565_to_yv12_c; packedFunc rgb_to_yv12_c; packedFunc bgr_to_yv12_c; packedFunc bgra_to_yv12_c;
------解决方案--------------------
#ifndef GET565RValue
#define GET565RValue(rgb) ((BYTE) (((((WORD)(rgb))&0xF800))>>8) )
#endif
#ifndef GET565GValue
#define GET565GValue(rgb) ((BYTE) (((((WORD)(rgb))&0x07E0))>>3) )
#endif
#ifndef GET565BValue
#define GET565BValue(rgb) ((BYTE) (((((WORD)(rgb))&0x001F)) << 3) )
#endif
#define CLIP(v) ( (v)<0? 0 : (v>255?255:v) )
#define GETY(r,g,b) ( ( 66 * (r) + 129 * (g) + 25 * (b) + 128) >> 8) + 16
#define GETU(r,g,b) ( ( -38 * (r) - 74 * (g) + 112 * (b) + 128) >> 8) + 128
#define GETV(r,g,b) ( ( 112 * (r) - 94 * (g) - 18 * (b) + 128) >> 8) + 128
void RgbToYuv(unsigned char *pRgbData, int w, int h, unsigned char *pYuv, int iLen)
{
unsigned char *pY, *pU, *pV, y, u, v;
WORD word, r, g, b;
WORD *pRgb = (WORD *)pRgbData;
int iVideSize = w * h;
pY = pYuv;
pU = (pY + iVideSize);
pV = (pU + iVideSize/4);
int off = 0, iChromaOff = 0;
for(int row=0; row<h; row++)
{
off = row * w;
iChromaOff = row/2 * w/2;
for(int col=0; col<w; col++)
{
word = *(pRgb + off + col);
r = GET565RValue(word);
g = GET565GValue(word);
b = GET565BValue(word);
y = CLIP(GETY(r,g,b));
pY[off + col] = y;
if( !(row%2) && !(col%2) )
{
u = CLIP(GETU(r,g,b));
v = CLIP(GETV(r,g,b));
pU[iChromaOff + col/2] = u;
pV[iChromaOff + col/2] = v;
}
}
}
}
我这里也有一个, 不过用的时候有个奇怪的问题,第1桢是正常的, 第2,3,4桢是花的, 第5桢又是正常的, 这样中间有三个桢是花的, 是不是算法那里还有问题呀