⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skl_yuv_c.cpp

📁 mpeg4编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////// 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 + -