h264idct.c

来自「This the source release kit for the foll」· C语言 代码 · 共 458 行 · 第 1/2 页

C
458
字号

void ff_h264_lowres_idct_add_c(uint8_t *dst, int stride, DCTELEM *block){
    idct_internal(dst, block, stride, 8, 3, 1);
}

void ff_h264_lowres_idct_put_c(uint8_t *dst, int stride, DCTELEM *block){
    idct_internal(dst, block, stride, 8, 3, 0);
}

void ff_h264_idct8_add_c(uint8_t *dst, DCTELEM *block, int stride){
    int i;
    DCTELEM (*src)[8] = (DCTELEM(*)[8])block;
    uint8_t *cm = cropTbl + MAX_NEG_CROP;
    
    block[0] += 32;
#if 1
    for( i = 0; i < 8; i++ )
   {  
      #if 1
        const int a0 =  src[i][0] + src[i][4];
        const int a2 =  src[i][0] - src[i][4];
        const int a4 = (src[i][2]>>1) - src[i][6];
        const int a6 = (src[i][6]>>1) + src[i][2];     
       #else 
        const t0=src[i][0];
        const t1=src[i][1];
  const t2=src[i][2];
        const t3=src[i][3]; 
        const t4=src[i][4];
        const t5=src[i][5];
        const t6=src[i][6];
        const t7=src[i][7];
  
       const int a0 =  t0 + t4;          
       const int a2 =  t0 - t4;          
       const int a4 = (t2>>1) -t6;      
       const int a6 = (t6>>1) + t2;       
        #endif
        const int b0 = a0 + a6;
        const int b2 = a2 + a4;
        const int b4 = a2 - a4;
        const int b6 = a0 - a6;
     #if 1
        const int a1 = -src[i][3] + src[i][5] - src[i][7] - (src[i][7]>>1);
        const int a3 =  src[i][1] + src[i][7] - src[i][3] - (src[i][3]>>1);
        const int a5 = -src[i][1] + src[i][7] + src[i][5] + (src[i][5]>>1);
        const int a7 =  src[i][3] + src[i][5] + src[i][1] + (src[i][1]>>1);
       #else
        const int a1 = -t3 + t5 - t7 - (t7>>1);
        const int a3 =  t1 +t7 - t3 - (t3>>1);
        const int a5 = -t1 + t7 + t5 + (t5>>1);
        const int a7 =  t3 + t5 + t1 + (t1>>1);
 #endif 
        const int b1 = (a7>>2) + a1;
        const int b3 =  a3 + (a5>>2);
        const int b5 = (a3>>2) - a5;
        const int b7 =  a7 - (a1>>2);

        src[i][0] = b0 + b7;
        src[i][7] = b0 - b7;
        src[i][1] = b2 + b5;
        src[i][6] = b2 - b5;
        src[i][2] = b4 + b3;
        src[i][5] = b4 - b3;
        src[i][3] = b6 + b1;
        src[i][4] = b6 - b1; 
    }
    for( i = 0; i < 8; i++ )
    { 
        
                          
                          
 #if 1    
       
        const int a0 =  src[0][i] + src[4][i];
        const int a2 =  src[0][i] - src[4][i];
        const int a4 = (src[2][i]>>1) - src[6][i];
        const int a6 = (src[6][i]>>1) + src[2][i];
      #else
  const t0=src[0][i];
        const t1=src[1][i];
  const t2=src[2][i];
        const t3=src[3][i]; 
        const t4=src[4][i];
        const t5=src[5][i];  
        const t6=src[6][i];  
        const t7=src[7][i];    
       const int a0 =  t0 + t4;          
       const int a2 =  t0 - t4;          
       const int a4 = (t2>>1) -t6;      
       const int a6 = (t6>>1) + t2;      
 #endif 
        const int b0 = a0 + a6;
        const int b2 = a2 + a4;
        const int b4 = a2 - a4;
        const int b6 = a0 - a6;
       #if 1
        const int a1 = -src[3][i] + src[5][i] - src[7][i] - (src[7][i]>>1);
        const int a3 =  src[1][i] + src[7][i] - src[3][i] - (src[3][i]>>1);
        const int a5 = -src[1][i] + src[7][i] + src[5][i] + (src[5][i]>>1);
        const int a7 =  src[3][i] + src[5][i] + src[1][i] + (src[1][i]>>1);
        #else
        const int a1 = -t3 + t5 - t7 - (t7>>1);
        const int a3 =  t1 +t7 - t3 - (t3>>1);
        const int a5 = -t1 + t7 + t5 + (t5>>1);
        const int a7 =  t3 + t5 + t1 + (t1>>1);
      #endif
  
        const int b1 = (a7>>2) + a1;
        const int b3 =  a3 + (a5>>2);
        const int b5 = (a3>>2) - a5;
        const int b7 =  a7 - (a1>>2);

        dst[i + 0*stride] = cm[ dst[i + 0*stride] + ((b0 + b7) >> 6) ];
        dst[i + 1*stride] = cm[ dst[i + 1*stride] + ((b2 + b5) >> 6) ];
        dst[i + 2*stride] = cm[ dst[i + 2*stride] + ((b4 + b3) >> 6) ];
        dst[i + 3*stride] = cm[ dst[i + 3*stride] + ((b6 + b1) >> 6) ];
        dst[i + 4*stride] = cm[ dst[i + 4*stride] + ((b6 - b1) >> 6) ];
        dst[i + 5*stride] = cm[ dst[i + 5*stride] + ((b4 - b3) >> 6) ];
        dst[i + 6*stride] = cm[ dst[i + 6*stride] + ((b2 - b5) >> 6) ];
        dst[i + 7*stride] = cm[ dst[i + 7*stride] + ((b0 - b7) >> 6) ];
    }
#else
        int a0 ;
        int a1 ;  
        int a2 ;
        int a3 ;   
        int a4 ;
        int a5 ;
        int a6 ;
        int a7 ;
        int b0 ;
        int b1 ;
        int b2 ;
        int b3 ;
        int b4 ;
        int b5 ;
        int b6 ;
        int b7 ;               
          
       H264_IDCT8_DC_ADD_I(0);
       H264_IDCT8_DC_ADD_I(1);
       H264_IDCT8_DC_ADD_I(2);
       H264_IDCT8_DC_ADD_I(3);
       H264_IDCT8_DC_ADD_I(4);
       H264_IDCT8_DC_ADD_I(5);
       H264_IDCT8_DC_ADD_I(6);
       H264_IDCT8_DC_ADD_I(7);
       H264_IDCT8_DC_ADD_II(0);
       H264_IDCT8_DC_ADD_II(1);
       H264_IDCT8_DC_ADD_II(2);
       H264_IDCT8_DC_ADD_II(3);
       H264_IDCT8_DC_ADD_II(4);
       H264_IDCT8_DC_ADD_II(5);
       H264_IDCT8_DC_ADD_II(6);
       H264_IDCT8_DC_ADD_II(7);
#endif

}

// assumes all AC coefs are 0

    

void ff_h264_idct_dc_add_c(uint8_t *dst, DCTELEM *block, int stride){
    int i, j;
    uint8_t *cm = cropTbl + MAX_NEG_CROP;
    int dc = (block[0] + 32) >> 6;
#if 0
 for( j = 0; j < 4; j++ )
    {
        for( i = 0; i < 4; i++ )
            dst[i] = cm[ dst[i] + dc ];
        dst += stride;
    }

#else
  i = 2*stride;
  j = 3*stride;
  //FF_H264_IDCT_DC_ADD_M(0);
  dst[0] = cm[ dst[0] + dc ];  
  dst[1] = cm[ dst[1] + dc ];  
  dst[2] = cm[ dst[2] + dc ];  
  dst[3] = cm[ dst[3] + dc ];  
  //FF_H264_IDCT_DC_ADD_M(1);
  dst[0+stride] = cm[ dst[0+stride] + dc ];  
  dst[1+stride] = cm[ dst[1+stride] + dc ];  
  dst[2+stride] = cm[ dst[2+stride] + dc ];  
  dst[3+stride] = cm[ dst[3+stride] + dc ];  
  //FF_H264_IDCT_DC_ADD_M(2);
  dst[0+i] = cm[ dst[0+i] + dc ];  
  dst[1+i] = cm[ dst[1+i] + dc ];  
  dst[2+i] = cm[ dst[2+i] + dc ];  
  dst[3+i] = cm[ dst[3+i] + dc ];  
  //FF_H264_IDCT_DC_ADD_M(3);
  dst[0+j] = cm[ dst[0+j] + dc ];  
  dst[1+j] = cm[ dst[1+j] + dc ];  
  dst[2+j] = cm[ dst[2+j] + dc ];  
  dst[3+j] = cm[ dst[3+j] + dc ];  
#endif
}

void ff_h264_idct8_dc_add_c(uint8_t *dst, DCTELEM *block, int stride){
    int i, j;
    uint8_t *cm = cropTbl + MAX_NEG_CROP;
    int dc = (block[0] + 32) >> 6;
#if 1

 for( j = 0; j < 8; j++ )
    {
        for( i = 0; i < 8; i++ )
            dst[i] = cm[ dst[i] + dc ];
        dst += stride;
    }
#else
       FF_H264_IDCT8_DC_ADD_M(0);
 FF_H264_IDCT8_DC_ADD_M(1);
 FF_H264_IDCT8_DC_ADD_M(2);
 FF_H264_IDCT8_DC_ADD_M(3);
 FF_H264_IDCT8_DC_ADD_M(4);
 FF_H264_IDCT8_DC_ADD_M(5);
 FF_H264_IDCT8_DC_ADD_M(6);
 FF_H264_IDCT8_DC_ADD_M(7);
#endif 
}

#endif /* ] */

⌨️ 快捷键说明

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