Last active
June 18, 2025 09:24
-
-
Save xeecos/db966a260a84bfff86c0b5535b82e7bd to your computer and use it in GitHub Desktop.
查表法实现RGB888转YUV420SP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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