?? yuv2rgb.h
字號:
#ifndef _YUY2RGB_H
#define _YUY2RGB_H
#ifndef byte
typedef unsigned char byte;
#endif
byte clip(double x)
{
if( x<0 )
return 0;
if( x>255 )
return 255;
return static_cast<byte>(x);
}
/*
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
*/
static void yuv2rgb(byte* yb, byte* ub, byte* vb, byte* rgb,
int w, int h, int y_stride, int uv_stride, int out_stride)
{
double y, u, v;
for( int i=0; i<h; i++ )
{
for( int j=0; j<w; j++ )
{
y = *yb;
u = *ub;
v = *vb;
rgb[2] = clip(1.164*(y - 16) + 2.018*(u - 128)); // B
rgb[1] = clip(1.164*(y - 16) - 0.813*(v - 128) - 0.391*(u - 128)); // G
rgb[0] = clip(1.164*(y - 16) + 1.596*(v - 128)); // R
yb += y_stride;
if( j%2 == 1 )
{
ub += uv_stride;
vb += uv_stride;
}
rgb += out_stride;
}
}
}
// YUY2: Y0 U0 Y1 V0...
// 8 8 8 8
// Y0 : YUY2
// U0 : YUY2 + 1
// Y1 : YUY2 + 2
// V0 : YUY2 + 3
static void yuy2_rgb24(byte* yuy2, int w, int h, byte* rgb)
{
yuv2rgb(yuy2, yuy2+1, yuy2+3, rgb, w, h, 2, 4, 3);
// yuv2rgb_24(yuy2, w, yuy2+1, yuy2+3, w/2, rgb, w, h, w*3 );
}
// UYVY: U0 Y0 V0 Y1...
// 8 8 8 8
// Y0 : UYVY + 1
// U0 : UYVY
// Y1 : UYVY + 3
// V0 : UYVY + 2
static void uyvy_rgb24(byte* uyvy, int w, int h, byte* rgb)
{
yuv2rgb(uyvy+1, uyvy, uyvy+2, rgb, w, h, 2, 4, 3);
// yuv2rgb_24(uyvy+1, 2, uyvy, uyvy+2, 4, rgb, w, h, 3 );
}
#endif // _YUY2RGB_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -