📄 skl_yuv_c.cpp
字号:
//////////////////////////////////////////////////////////// Raw-C impl.//////////////////////////////////////////////////////////static SKL_UINT16 CTable_565[3][256+2*384]; // 6kstatic SKL_UINT32 CTable_32[3][256+2*384]; // 12kstatic SKL_UINT32 Ycc_Cr_To_R[256]; // 1kstatic SKL_UINT32 Ycc_Cb_To_G[256];static SKL_UINT32 Ycc_Cr_To_G[256];static SKL_UINT32 Ycc_Cb_To_B[256];extern "C" void Skl_Init_RGB_To_YUV_Table(int Transfer_Type);extern SKL_UINT16 Skl_RGB_To_YUV_Tab[3][256][4];#define PROLOG(Size) \ Y += Width; \ U += Width/2; V += Width/2; \ RGB += Width*Size; \ for(int j=Height/2; j>0; --j) { \ const SKL_BYTE *Y2 = Y + Src_BpS; \ SKL_BYTE *RGB2 = RGB + Dst_BpS; \ for(int i=-Width/2; i<0; i++) { \#define EPILOG \ } \ RGB += 2*Dst_BpS; \ Y += 2*Src_BpS; \ U += Src_BpS; \ V += Src_BpS; \ }#define GET_CC(x) \ const SKL_UINT32 cb = U[x]; \ const SKL_UINT32 cr = V[x]; \ const SKL_UINT32 R = Ycc_Cr_To_R[cr]; \ const SKL_UINT32 G = Ycc_Cb_To_G[cb] + Ycc_Cr_To_G[cr]; \ const SKL_UINT32 B = Ycc_Cb_To_B[cb]#define PUT_Y(T,x,YSrc, RGB_Dst, CTab) { \ const SKL_UINT32 y = YSrc[x]; \ ((T*)RGB_Dst)[x] = ( CTab[0][R+y] | CTab[1][G+y] | CTab[2][B+y] ); \}#define PUT_Y3(x,YSrc, RGB_Dst, CTab) { \ const SKL_UINT32 y = YSrc[x]; \ const SKL_UINT32 rgb = ( CTab[0][R+y] | CTab[1][G+y] | CTab[2][B+y] ); \ RGB_Dst[3*(x)+2] = (rgb >> 0) & 0xff; \ RGB_Dst[3*(x)+1] = (rgb >> 8) & 0xff; \ RGB_Dst[3*(x)+0] = (rgb >>16) & 0xff; \}//////////////////////////////////////////////////////////RGB_TO_YUV_FUNC_DCL(Skl_RGB565_To_YUV_C) { for(int y=0; y<Height/2; y++) { SKL_BYTE *pDst1 = Y; SKL_BYTE *pDst2 = Y+Dst_BpS; const SKL_UINT16 *pSrc1 = (SKL_UINT16*)RGB; const SKL_UINT16 *pSrc2 = (SKL_UINT16*)(RGB + Src_BpS); for(int x=0; x<Width/2; x++) { int r,g,b, u,v; RGB565_TO_RGB(pSrc1[2*x+0]); pDst1[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u = Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v = Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB565_TO_RGB(pSrc1[2*x+1]); pDst1[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB565_TO_RGB(pSrc2[2*x+0]); pDst2[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB565_TO_RGB(pSrc2[2*x+1]); pDst2[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; U[x] = u>>10; V[x] = v>>10; } RGB += 2*Src_BpS; Y += 2*Dst_BpS; U += Dst_BpS; V += Dst_BpS; }}static YUV_TO_RGB_FUNC_DCL(YUV_To_RGB565_C){ PROLOG(2) GET_CC(i); PUT_Y(SKL_UINT16,2*i, Y , RGB , CTable_565); PUT_Y(SKL_UINT16,2*i+1, Y , RGB , CTable_565); PUT_Y(SKL_UINT16,2*i, Y2, RGB2, CTable_565); PUT_Y(SKL_UINT16,2*i+1, Y2, RGB2, CTable_565); EPILOG}RGB_TO_YUV_FUNC_DCL(Skl_RGB24_To_YUV_C) { for(int y=0; y<Height/2; y++) { SKL_BYTE *pDst1 = Y; SKL_BYTE *pDst2 = Y+Dst_BpS; const SKL_BYTE *pSrc1 = RGB; const SKL_BYTE *pSrc2 = RGB + Src_BpS; for(int x=0; x<Width/2; x++) { int r,g,b, u,v; RGB24_TO_RGB(&pSrc1[6*x+0]); pDst1[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u = Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v = Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB24_TO_RGB(&pSrc1[6*x+3]); pDst1[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB24_TO_RGB(&pSrc2[6*x+0]); pDst2[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB24_TO_RGB(&pSrc2[6*x+3]); pDst2[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; U[x] = u>>10; V[x] = v>>10; } RGB += 2*Src_BpS; Y += 2*Dst_BpS; U += Dst_BpS; V += Dst_BpS; }}static YUV_TO_RGB_FUNC_DCL(YUV_To_RGB24_C){ PROLOG(3) GET_CC(i); PUT_Y3(2*i, Y , RGB , CTable_32); PUT_Y3(2*i+1, Y , RGB , CTable_32); PUT_Y3(2*i, Y2, RGB2, CTable_32); PUT_Y3(2*i+1, Y2, RGB2, CTable_32); EPILOG}RGB_TO_YUV_FUNC_DCL(Skl_RGB32_To_YUV_C) { for(int y=0; y<Height/2; y++) { SKL_BYTE *pDst1 = Y; SKL_BYTE *pDst2 = Y+Dst_BpS; const SKL_UINT32 *pSrc1 = (SKL_UINT32*)RGB; const SKL_UINT32 *pSrc2 = (SKL_UINT32*)(RGB + Src_BpS); for(int x=0; x<Width/2; x++) { int r,g,b, u,v; RGB32_TO_RGB(pSrc1[2*x+0]); pDst1[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u = Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v = Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB32_TO_RGB(pSrc1[2*x+1]); pDst1[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB32_TO_RGB(pSrc2[2*x+0]); pDst2[2*x+0] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; RGB32_TO_RGB(pSrc2[2*x+1]); pDst2[2*x+1] = (Skl_RGB_To_YUV_Tab[0][r][2] + Skl_RGB_To_YUV_Tab[1][g][2] + Skl_RGB_To_YUV_Tab[2][b][2])>>8; u += Skl_RGB_To_YUV_Tab[0][r][1] - Skl_RGB_To_YUV_Tab[1][g][1] + Skl_RGB_To_YUV_Tab[2][b][1]; v += Skl_RGB_To_YUV_Tab[0][r][0] - Skl_RGB_To_YUV_Tab[1][g][0] - Skl_RGB_To_YUV_Tab[2][b][0]; U[x] = u>>10; V[x] = v>>10; } RGB += 2*Src_BpS; Y += 2*Dst_BpS; U += Dst_BpS; V += Dst_BpS; }}static YUV_TO_RGB_FUNC_DCL(YUV_To_RGB32_C){ PROLOG(4) GET_CC(i); PUT_Y(SKL_UINT32,2*i, Y , RGB , CTable_32); PUT_Y(SKL_UINT32,2*i+1, Y , RGB , CTable_32); PUT_Y(SKL_UINT32,2*i, Y2, RGB2, CTable_32); PUT_Y(SKL_UINT32,2*i+1, Y2, RGB2, CTable_32); EPILOG}//////////////////////////////////////////////////////////// -- Entry point////////////////////////////////////////////////////////////// ISO 14496-2 - Table 6-9 (inverted)// // these 4 floats C[0..3] are the Cb/Cr coefficients in the Ycc->RGB matrix://// R = Y + + C[0].Cr // G = Y + C[1].Cb + C[2].Cr// B = Y + C[3].Cb//static const float Ycc_Cb_Cr_Coeffs_Table[8][4] = { {1.539844f, -0.182861f, -0.457390f, 1.814373f}, // forbidden {1.539844f, -0.182861f, -0.457390f, 1.814373f}, // ITU-R Rec. 709 (1990) { .0, .0, .0, .0}, // Unspecified video { .0, .0, .0, .0}, // Reserved {1.368750f, -0.324457f, -0.695972f, 1.740266f}, // ITU-R Rec. 624-4 System M {1.370703f, -0.336460f, -0.698200f, 1.732443f}, // ITU-R Rec. 624-4 System B-G {1.370703f, -0.336460f, -0.698200f, 1.732443f}, // SMPTE 170M {1.540827f, -0.221559f, -0.465986f, 1.785241f} // SMPTE 240M (1987)};//////////////////////////////////////////////////////////static int Init_YUV_RGB_C(int Transfer_Type){ SKL_ASSERT(Transfer_Type>0 && Transfer_Type<8); if (Transfer_Type<0 || Transfer_Type>=8 || Ycc_Cb_Cr_Coeffs_Table[Transfer_Type][0]==0.) return 0; const float *Coeffs = Ycc_Cb_Cr_Coeffs_Table[Transfer_Type]; int i; for(i=-348; i<256+384; ++i) { const int C = SAT(i); CTable_32[0][i+384] = (C << 16); // R CTable_32[1][i+384] = (C << 8); // G CTable_32[2][i+384] = (C << 0); // B CTable_565[0][i+384] = (C << 8) & 0xf800; // R CTable_565[1][i+384] = (C << 3) & 0x07e0; // G CTable_565[2][i+384] = (C >> 3) & 0x001f; // B } for(i=0; i<256; ++i) { Ycc_Cr_To_R[i] = (int)( Coeffs[0]*(i-128) ) +384; Ycc_Cb_To_G[i] = (int)( Coeffs[1]*(i-128) ) +384; Ycc_Cr_To_G[i] = (int)( Coeffs[2]*(i-128) ); Ycc_Cb_To_B[i] = (int)( Coeffs[3]*(i-128) ) +384; } Skl_Init_RGB_To_YUV_Table(Transfer_Type); return 1;}#undef RGB_TO_Y#undef RGB_TO_U#undef RGB_TO_V#undef RGB565_TO_RGB#undef RGB24_TO_RGB#undef SAT#undef TO_RGB32#undef TO_RGB24#undef TO_RGB565//////////////////////////////////////////////////////////SKL_YUV_DSP Skl_YUV_DSP_C = { "YUV--C-", Skl_Switch_None, Init_YUV_RGB_C, Skl_RGB565_To_YUV_C, YUV_To_RGB565_C, Skl_RGB24_To_YUV_C, YUV_To_RGB24_C, Skl_RGB32_To_YUV_C, YUV_To_RGB32_C,};//////////////////////////////////////////////////////////} // extern "C"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -