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

📄 transform8x8.c

📁 JM 11.0 KTA 2.1 Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    b[0] = a[0] + a[6];
    b[2] = a[4] + a[2];
    b[4] = a[4] - a[2];
    b[6] = a[0] - a[6];

    a[1] = -img->m7[ioff + 3][joff + i] + img->m7[ioff + 5][joff + i] - img->m7[ioff + 7][joff + i] - (img->m7[ioff + 7][joff + i]>>1);
    a[3] = img->m7[ioff + 1][joff + i] + img->m7[ioff + 7][joff + i] - img->m7[ioff + 3][joff + i] - (img->m7[ioff + 3][joff + i]>>1);
    a[5] = -img->m7[ioff + 1][joff + i] + img->m7[ioff + 7][joff + i] + img->m7[ioff + 5][joff + i] + (img->m7[ioff + 5][joff + i]>>1);
    a[7] = img->m7[ioff + 3][joff + i] + img->m7[ioff + 5][joff + i] + img->m7[ioff + 1][joff + i] + (img->m7[ioff + 1][joff + i]>>1);

    b[1] = a[1] + (a[7]>>2);
//    b[7] = -(a[1]>>2 + 0) + a[7];  KS: do we need to add zero?
    b[7] = -(a[1]>>2) + a[7];
    b[3] = a[3] + (a[5]>>2);
    b[5] = (a[3]>>2) - a[5];

    m6[0][i] = b[0] + b[7];
    m6[1][i] = b[2] + b[5];
    m6[2][i] = b[4] + b[3];
    m6[3][i] = b[6] + b[1];
    m6[4][i] = b[6] - b[1];
    m6[5][i] = b[4] - b[3];
    m6[6][i] = b[2] - b[5];
    m6[7][i] = b[0] - b[7];
  }
  for( i=0; i<8 && !lossless_qpprime; i++)
  {
    int a[8], b[8];
    a[0] = m6[i][0] + m6[i][4];
    a[4] = m6[i][0] - m6[i][4];
    a[2] = (m6[i][2]>>1) - m6[i][6];
    a[6] = m6[i][2] + (m6[i][6]>>1);

    b[0] = a[0] + a[6];
    b[2] = a[4] + a[2];
    b[4] = a[4] - a[2];
    b[6] = a[0] - a[6];

    a[1] = -m6[i][3] + m6[i][5] - m6[i][7] - (m6[i][7]>>1);
    a[3] = m6[i][1] + m6[i][7] - m6[i][3] - (m6[i][3]>>1);
    a[5] = -m6[i][1] + m6[i][7] + m6[i][5] + (m6[i][5]>>1);
    a[7] = m6[i][3] + m6[i][5] + m6[i][1] + (m6[i][1]>>1);

    b[1] = a[1] + (a[7]>>2);
    b[7] = -(a[1]>>2) + a[7];
    b[3] = a[3] + (a[5]>>2);
    b[5] = (a[3]>>2) - a[5];

    img->m7[ioff + i][joff + 0] = b[0] + b[7];
    img->m7[ioff + i][joff + 1] = b[2] + b[5];
    img->m7[ioff + i][joff + 2] = b[4] + b[3];
    img->m7[ioff + i][joff + 3] = b[6] + b[1];
    img->m7[ioff + i][joff + 4] = b[6] - b[1];
    img->m7[ioff + i][joff + 5] = b[4] - b[3];
    img->m7[ioff + i][joff + 6] = b[2] - b[5];
    img->m7[ioff + i][joff + 7] = b[0] - b[7];
  }
  for( i=0; i<8; i++)
  {
    for( j=0; j<8; j++)
    {
      // Residue Color Transform
      if(!residue_transform_flag)
      {
        if(lossless_qpprime)
          img->m7[i+ioff][j+joff] =min(img->max_imgpel_value,max(0,img->m7[ioff + i][joff + j]+(long)img->mpr[i+ioff][j+joff]));
        else
          img->m7[i+ioff][j+joff] =min(img->max_imgpel_value,max(0,(img->m7[ioff + i][joff + j]+((long)img->mpr[i+ioff][j+joff] << DQ_BITS_8)+DQ_ROUND_8)>>DQ_BITS_8));
      }
      else
      {
        if(lossless_qpprime)
          img->m7[i+ioff][j+joff] = img->m7[ioff + i][joff + j];
        else
          img->m7[i+ioff][j+joff] =(img->m7[ioff + i][joff + j]+DQ_ROUND_8)>>DQ_BITS_8;
      }
    }
  }
} 

#ifdef USE_INTRA_MDDT

const int KLTRow8[9][8][8] = 
{ // 0 
{
{ -22,   57,   63,  -59,   53,  -41,   23,   13},
{ -30,   65,   41,    7,  -46,   59,  -55,  -29},
{ -38,   51,  -16,   62,  -37,  -17,   66,   47},
{ -45,   30,  -58,   31,   46,  -46,  -36,  -60},
{ -51,    2,  -57,  -44,   31,   55,  -18,   64},
{ -55,  -27,  -16,  -59,  -51,    1,   54,  -58},
{ -56,  -48,   32,    4,  -37,  -60,  -57,   41},
{ -51,  -48,   51,   51,   55,   45,   27,  -17},
},
{ // 1
{ -18,  -38,   50,  -57,   57,  -56,   45,  -24},
{ -30,  -58,   57,  -27,  -13,   45,  -63,   44},
{ -38,  -57,   14,   49,  -58,   17,   45,  -59},
{ -44,  -42,  -42,   55,   22,  -58,   -3,   64},
{ -50,  -15,  -65,  -20,   53,   35,  -40,  -59},
{ -54,   19,  -37,  -63,  -37,   27,   60,   45},
{ -57,   49,   17,  -15,  -50,  -66,  -52,  -28},
{ -56,   60,   53,   49,   49,   37,   21,   10},
},
{ // 2
{ -24,  -55,   65,  -51,   47,  -49,   31,  -20},
{ -34,  -62,   45,    1,  -33,   60,  -55,   41},
{ -41,  -50,  -19,   62,  -48,   -6,   46,  -60},
{ -47,  -30,  -60,   30,   45,  -47,  -16,   65},
{ -50,    0,  -53,  -50,   40,   51,  -28,  -59},
{ -53,   29,  -14,  -58,  -54,    7,   63,   47},
{ -54,   50,   26,    1,  -37,  -62,  -66,  -26},
{ -50,   53,   50,   55,   54,   40,   31,    8},
},
{ // 3
{ -31,   61,   64,  -55,   48,  -37,   25,   12},
{ -39,   63,   30,   13,  -49,   60,  -54,  -30},
{ -45,   44,  -29,   63,  -35,  -24,   61,   47},
{ -49,   17,  -62,   19,   56,  -39,  -37,  -59},
{ -51,  -12,  -50,  -52,   25,   60,  -10,   64},
{ -51,  -37,   -7,  -55,  -58,   -9,   51,  -58},
{ -49,  -50,   36,   10,  -27,  -58,  -64,   43},
{ -44,  -49,   52,   55,   51,   48,   33,  -18},
},
{ // 4
{ -11,  -25,   42,  -56,   61,  -61,   49,  -30},
{ -22,  -49,   61,  -46,    4,   40,  -61,   48},
{ -34,  -61,   34,   30,  -62,   25,   40,  -58},
{ -44,  -53,  -24,   59,   10,  -60,    1,   61},
{ -52,  -25,  -63,   -4,   57,   33,  -40,  -56},
{ -58,   15,  -45,  -62,  -30,   26,   59,   44},
{ -60,   50,   16,  -17,  -48,  -61,  -54,  -29},
{ -55,   59,   55,   51,   47,   37,   25,   12},
},
{ // 5
{ -12,   28,   44,  -60,   63,  -61,   42,   20},
{ -24,   53,   60,  -40,   -7,   51,  -62,  -36},
{ -36,   62,   27,   37,  -59,   11,   54,   51},
{ -46,   49,  -30,   56,   20,  -57,  -18,  -62},
{ -52,   19,  -64,  -11,   53,   41,  -27,   63},
{ -57,  -19,  -42,  -62,  -35,   17,   55,  -53},
{ -59,  -50,   20,  -14,  -46,  -58,  -55,   36},
{ -54,  -57,   56,   50,   48,   38,   27,  -15},
},
{ // 6
{ -10,  -27,   45,  -61,   54,  -63,   49,  -25},
{ -22,  -50,   60,  -43,    0,   42,  -65,   45},
{ -34,  -61,   31,   34,  -59,   28,   44,  -57},
{ -44,  -52,  -24,   57,   10,  -62,   -2,   63},
{ -52,  -25,  -61,   -7,   60,   26,  -39,  -59},
{ -57,   15,  -45,  -59,  -27,   32,   59,   47},
{ -60,   49,   13,  -18,  -56,  -58,  -50,  -29},
{ -55,   59,   57,   50,   50,   32,   21,   11},
},
{ // 7
{ -30,   60,   64,  -56,   50,  -38,   25,   12},
{ -38,   63,   32,   11,  -48,   60,  -55,  -30},
{ -44,   46,  -26,   63,  -35,  -22,   61,   48},
{ -48,   19,  -62,   22,   53,  -41,  -35,  -60},
{ -51,  -10,  -52,  -51,   27,   58,  -13,   64},
{ -52,  -35,   -9,  -56,  -57,   -7,   52,  -57},
{ -51,  -50,   36,    9,  -29,  -59,  -62,   42},
{ -45,  -49,   51,   54,   52,   48,   32,  -18},
},
{ // 8
{ -13,  -33,   47,  -61,   58,  -57,   45,  -25},
{ -25,  -55,   60,  -34,   -8,   47,  -61,   45},
{ -36,  -61,   22,   44,  -60,   13,   42,  -58},
{ -46,  -47,  -36,   54,   24,  -58,   -7,   63},
{ -52,  -17,  -64,  -18,   53,   40,  -34,  -58},
{ -57,   20,  -36,  -60,  -41,   21,   60,   46},
{ -58,   49,   20,  -14,  -44,  -62,  -58,  -29},
{ -54,   57,   55,   51,   49,   37,   26,   10},
},
};

const int KLTCol8[9][8][8] = 
{
{  // 0
{ -22,  -32,  -40,  -44,  -49,  -53,  -55,  -55},
{ -37,  -52,  -56,  -43,  -15,   19,   51,   64},
{  43,   54,   24,  -34,  -70,  -46,   14,   53},
{ -60,  -31,   39,   61,   -5,  -59,  -23,   50},
{  64,   -9,  -58,   10,   53,  -31,  -52,   48},
{ -58,   54,   16,  -62,   39,   22,  -56,   30},
{  35,  -61,   50,  -12,  -36,   62,  -55,   23},
{ -21,   45,  -59,   61,  -57,   49,  -32,   13},
},
{  // 1
{ -26,  -37,  -42,  -43,  -47,  -54,  -55,  -49},
{  66,   66,   37,   16,    2,  -19,  -49,  -57},
{ -53,  -38,   32,   79,   48,  -20,  -42,  -18},
{ -30,   28,   63,    9,  -67,  -61,   11,   48},
{  68,  -26,  -43,   29,   16,  -56,  -23,   67},
{ -43,   57,   -9,  -51,   53,   -1,  -58,   48},
{  29,  -57,   60,  -29,  -23,   55,  -59,   30},
{ -17,   34,  -51,   60,  -62,   55,  -40,   18},
},
{ // 2
{ -29,  -38,  -43,  -46,  -49,  -51,  -51,  -49},
{  52,   61,   50,   26,   -4,  -32,  -53,  -55},
{  55,   43,   -9,  -58,  -64,  -22,   33,   50},
{ -57,   -6,   59,   40,  -37,  -61,   -3,   53},
{  58,  -34,  -50,   40,   37,  -50,  -36,   51},
{ -42,   55,   -5,  -54,   52,    5,  -62,   45},
{  33,  -62,   57,  -24,  -25,   55,  -56,   27},
{  17,  -36,   52,  -59,   62,  -55,   39,  -16},
},
{ // 3
{ -13,  -27,  -37,  -44,  -52,  -57,  -58,  -53},
{ -27,  -52,  -62,  -50,  -17,   21,   51,   56},
{  43,   61,   27,  -35,  -67,  -37,   21,   50},
{ -56,  -39,   36,   56,  -15,  -62,  -12,   55},
{  67,   -3,  -59,   18,   50,  -37,  -44,   49},
{ -60,   46,   13,  -58,   40,   18,  -61,   39},
{  44,  -61,   47,  -10,  -34,   59,  -56,   26},
{ -24,   43,  -57,   62,  -59,   49,  -32,   12},
},
{ // 4
{ -11,  -22,  -34,  -44,  -53,  -59,  -60,  -53},
{  22,   47,   62,   54,   25,  -15,  -51,  -59},
{  39,   62,   38,  -23,  -64,  -43,   16,   54},
{ -58,  -47,   29,   59,   -5,  -58,  -16,   52},
{  68,    1,  -59,   14,   52,  -33,  -46,   47},
{ -62,   46,   14,  -57,   37,   22,  -60,   38},
{  45,  -63,   49,  -12,  -32,   58,  -54,   25},
{  21,  -40,   55,  -63,   61,  -50,   32,  -12},
},
{ // 5
{ -11,  -22,  -32,  -42,  -51,  -58,  -61,  -57},
{ -24,  -45,  -60,  -55,  -31,    9,   49,   62},
{  42,   62,   40,  -17,  -62,  -47,   11,   52},
{ -59,  -45,   28,   61,   -1,  -58,  -21,   50},
{  63,    2,  -59,    7,   57,  -28,  -51,   48},
{ -62,   43,   24,  -61,   31,   27,  -59,   34},
{  46,  -64,   45,   -5,  -38,   60,  -51,   23},
{ -24,   45,  -58,   61,  -57,   48,  -31,   12},
},
{ // 6
{ -13,  -26,  -37,  -45,  -52,  -56,  -59,  -54},
{  27,   53,   62,   48,   18,  -19,  -51,  -57},
{  40,   58,   29,  -30,  -65,  -43,   17,   57},
{ -57,  -45,   34,   60,   -9,  -60,  -15,   50},
{  65,   -3,  -62,   19,   53,  -36,  -43,   45},
{ -66,   51,    7,  -54,   43,   12,  -55,   37},
{  42,  -61,   54,  -25,  -19,   54,  -59,   29},
{  17,  -34,   50,  -60,   63,  -56,   39,  -15},
},
{ // 7
{ -14,  -27,  -37,  -44,  -52,  -56,  -58,  -55},
{ -29,  -52,  -61,  -48,  -20,   18,   51,   60},
{  43,   59,   29,  -30,  -67,  -42,   17,   53},
{ -55,  -39,   32,   60,   -6,  -62,  -20,   54},
{  66,   -1,  -61,   10,   54,  -30,  -48,   46},
{ -62,   47,   17,  -60,   37,   22,  -59,   35},
{  43,  -61,   47,  -10,  -35,   60,  -55,   25},
{ -23,   44,  -57,   61,  -58,   49,  -31,   12},
},
{ // 8
{ -29,  -37,  -42,  -46,  -49,  -51,  -52,  -50},
{  67,   68,   44,   13,  -15,  -33,  -44,  -45},
{  66,   21,  -43,  -67,  -43,    1,   37,   47},
{ -54,   23,   61,    1,  -62,  -46,   15,   54},
{  45,  -50,  -22,   59,   12,  -64,  -25,   55},
{ -34,   58,  -28,  -35,   61,  -15,  -59,   49},
{  24,  -53,   63,  -41,   -5,   49,  -63,   31},
{  10,  -27,   44,  -57,   64,  -62,   46,  -19},
},
};


static int KLTCol8inProd[18][8], KLTRow8inProd[18][8];

/*! 
*************************************************************************************
* \brief
*   Compute inner product for the input 8x8 matrix 
*
* \para compute_inner_product8x8()
*    <paragraph>
*
* \author
*    - Yan Ye                      <yye@qualcomm.com>
*************************************************************************************
*/
void compute_inner_product8x8(int matrix[8][8], int isLeft, int *inner_prod)
{
  int i, j;

  if(isLeft)
    for(i = 0; i < 8; i++)
    {
      inner_prod[i] = 0;
      for(j = 0; j < 4; j++)
      {
        inner_prod[i] += matrix[i][2*j+1]*matrix[i][2*j];
      }
    }
  else
    for(i = 0; i < 8; i++)
    {
      inner_prod[i] = 0;
      for(j = 0; j < 4; j++)
      {
        inner_prod[i] += matrix[2*j+1][i]*matrix[2*j][i];
      }
    }
}

/*! 
*************************************************************************************
* \brief
*   Precompute inner products for all 8x8 transform matrices
*
* \para precompute_all_inner_product8x8()
*    <paragraph>
*
* \author
*    - Yan Ye                      <yye@qualcomm.com>
*************************************************************************************
*/
void precompute_all_inner_product8x8()
{
  int i, j, k;
  int temp2D[8][8];


  for(i = 0; i < 18; i++)
  {
    if(i == 2 || i == 9 || i > 11) // handled by DCT 
      continue;

    for(j = 0; j < 8; j++)
      for(k = 0; k < 8; k++)
        temp2D[j][k] = KLTCol8[i][k][j];
    compute_inner_product8x8(temp2D, 1, KLTCol8inProd[i]);

    for(j = 0; j < 8; j++)
      for(k = 0; k < 8; k++)
        temp2D[j][k] = KLTRow8[i][k][j];
    compute_inner_product8x8(temp2D, 0, KLTRow8inProd[i]);
  }
}

/*! 
*************************************************************************************
* \brief
*   Perform fast mode-dependent inverse 8x8 directional transform 
*
* \para itrans8x8klt_sep_fast()
*    <paragraph>
*
* \author
*    - Yan Ye                      <yye@qualcomm.com>
*************************************************************************************
*/
void itrans8x8klt_sep_fast( struct img_par *img, //!< image parameters
                            int ioff,            //!< index to 4x4 block
                            int joff,            //!<
                            int ipmode)
{
  int i, j, k; 
  int shift = 20, shiftby2 = 1<<(shift-1);
  int inprod[BLOCK_SIZE*2], 
      ilev  [BLOCK_SIZE*2][BLOCK_SIZE*2],
      temp2D[BLOCK_SIZE*2][BLOCK_SIZE*2], 
      y2D   [BLOCK_SIZE*2][BLOCK_SIZE*2];

  for(j = 0; j < 8; j++)
    for(i = 0; i < 8; i++)
    {
      ilev[j][i] = img->m7[ioff+i][joff+j];
    }

  compute_inner_product8x8(ilev, 0, inprod);

  // inverse transform, column first
  for (i=0;i<(BLOCK_SIZE*2);i++)
  {
    for (j=0;j<(BLOCK_SIZE*2);j++)
    {
      temp2D[i][j] = 0;
      for(k = 0; k < BLOCK_SIZE; k++)
        temp2D[i][j]+=
        (KLTCol8[ipmode][2*k][i]+ilev[2*k+1][j])*(KLTCol8[ipmode][2*k+1][i]+ilev[2*k][j]);
      temp2D[i][j] = temp2D[i][j] - KLTCol8inProd[ipmode][i] - inprod[j];
    }
  }

  compute_inner_product8x8(temp2D, 1, inprod);

  // inverse transform, row second 
  for (i=0;i<(BLOCK_SIZE*2);i++)
  {
    for (j=0;j<(BLOCK_SIZE*2);j++)
    {
      y2D[i][j] = 0;
      for(k = 0; k < BLOCK_SIZE; k++)
        y2D[i][j]+=
        (temp2D[i][2*k+1]+KLTRow8[ipmode][j][2*k])*(temp2D[i][2*k]+KLTRow8[ipmode][j][2*k+1]);
      y2D[i][j] = y2D[i][j] - inprod[i] - KLTRow8inProd[ipmode][j];
      
      img->m7[j+ioff][i+joff] =min(img->max_imgpel_value,max(0,(y2D[i][j]+((long)img->mpr[j+ioff][i+joff] << shift)+shiftby2)>>shift));
    }
  }
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -