Skip to content

Instantly share code, notes, and snippets.

@xeecos
Last active June 18, 2025 09:24
Show Gist options
  • Select an option

  • Save xeecos/db966a260a84bfff86c0b5535b82e7bd to your computer and use it in GitHub Desktop.

Select an option

Save xeecos/db966a260a84bfff86c0b5535b82e7bd to your computer and use it in GitHub Desktop.
查表法实现RGB888转YUV420SP
struct YUV2RGB
{
unsigned short Y_R[256],Y_G[256],Y_B[256],U_R[256],U_G[256],U_B[256],V_R[256],V_G[256],V_B[256];
};
static YUV2RGB yuv2rgb;
static inline int initYUVTables()
{
for(int i = 0; i < 256; i++)
{
yuv2rgb.Y_R[i] = (i * 1224) >> 12; //Y对应的查表数组
yuv2rgb.Y_G[i] = (i * 2404) >> 12;
yuv2rgb.Y_B[i] = (i * 467) >> 12;
yuv2rgb.U_R[i] = (i * 602) >> 12; //U对应的查表数组
yuv2rgb.U_G[i] = (i * 1183) >> 12;
yuv2rgb.U_B[i] = (i * 1785) >> 12;
yuv2rgb.V_R[i] = (i * 2519) >> 12; //V对应的查表数组
yuv2rgb.V_G[i] = (i * 2109) >> 12;
yuv2rgb.V_B[i] = (i * 409) >> 12;
}
}
static void rgb2yuv420sp(const unsigned char* bgrdata, int width, int height, unsigned char* yptr, unsigned char* uvptr, int stride)
{
for (int y = 0; y + 1 < height; y += 2)
{
const unsigned char* p0 = bgrdata + y * width * 3;
const unsigned char* p1 = bgrdata + (y + 1) * width * 3;
unsigned char* yptr0 = yptr + y * stride;
unsigned char* yptr1 = yptr + (y + 1) * stride;
unsigned char* uvptr0 = uvptr + (y / 2) * stride;
int x = 0;
for (; x + 1 < width; x += 2)
{
unsigned char r00 = p0[0];
unsigned char g00 = p0[1];
unsigned char b00 = p0[2];
unsigned char r01 = p0[3];
unsigned char g01 = p0[4];
unsigned char b01 = p0[5];
unsigned char r10 = p1[0];
unsigned char g10 = p1[1];
unsigned char b10 = p1[2];
unsigned char r11 = p1[3];
unsigned char g11 = p1[4];
unsigned char b11 = p1[5];
unsigned char y00 = yuv2rgb.Y_R[r00]+yuv2rgb.Y_G[g00]+yuv2rgb.Y_B[b00];
unsigned char y01 = yuv2rgb.Y_R[r01]+yuv2rgb.Y_G[g01]+yuv2rgb.Y_B[b01];
unsigned char y10 = yuv2rgb.Y_R[r10]+yuv2rgb.Y_G[g10]+yuv2rgb.Y_B[b10];
unsigned char y11 = yuv2rgb.Y_R[r11]+yuv2rgb.Y_G[g11]+yuv2rgb.Y_B[b11];
unsigned char b4 = (b00 + b01 + b10 + b11) >> 2;
unsigned char g4 = (g00 + g01 + g10 + g11) >> 2;
unsigned char r4 = (r00 + r01 + r10 + r11) >> 2;
unsigned char u = yuv2rgb.U_B[b4] - yuv2rgb.U_R[r4] - yuv2rgb.U_G[g4];
unsigned char v = yuv2rgb.V_R[r4] - yuv2rgb.V_G[g4] - yuv2rgb.V_B[b4];
yptr0[0] = y00;
yptr0[1] = y01;
yptr1[0] = y10;
yptr1[1] = y11;
uvptr0[0] = u;
uvptr0[1] = v;
p0 += 6;
p1 += 6;
yptr0 += 2;
yptr1 += 2;
uvptr0 += 2;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment