Ticket #113: ffmpeg-simpler-cabacresid.diff
| File ffmpeg-simpler-cabacresid.diff, 3.5 kB (added by astrange, 2 years ago) |
|---|
-
h264.c
old new 5980 5980 int nza, nzb; 5981 5981 int ctx = 0; 5982 5982 5983 if( cat == 0 ) { 5983 switch ( cat ) { 5984 case 0: 5984 5985 nza = h->left_cbp&0x100; 5985 5986 nzb = h-> top_cbp&0x100; 5986 } else if( cat == 1 || cat == 2 ) { 5987 break; 5988 case 1: case 2: 5987 5989 nza = h->non_zero_count_cache[scan8[idx] - 1]; 5988 5990 nzb = h->non_zero_count_cache[scan8[idx] - 8]; 5989 } else if( cat == 3 ) { 5991 break; 5992 case 3: 5990 5993 nza = (h->left_cbp>>(6+idx))&0x01; 5991 5994 nzb = (h-> top_cbp>>(6+idx))&0x01; 5992 } else { 5995 break; 5996 default: 5993 5997 assert(cat == 4); 5994 5998 nza = h->non_zero_count_cache[scan8[16+idx] - 1]; 5995 5999 nzb = h->non_zero_count_cache[scan8[16+idx] - 8]; … … 6013 6017 6014 6018 static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff) { 6015 6019 const int mb_xy = h->s.mb_x + h->s.mb_y*h->s.mb_stride; 6016 static const int significant_coeff_flag_offset[2][6] = {6020 static const uint16_t significant_coeff_flag_offset[2][6] = { 6017 6021 { 105+0, 105+15, 105+29, 105+44, 105+47, 402 }, 6018 6022 { 277+0, 277+15, 277+29, 277+44, 277+47, 436 } 6019 6023 }; 6020 static const int last_coeff_flag_offset[2][6] = {6024 static const uint16_t last_coeff_flag_offset[2][6] = { 6021 6025 { 166+0, 166+15, 166+29, 166+44, 166+47, 417 }, 6022 6026 { 338+0, 338+15, 338+29, 338+44, 338+47, 451 } 6023 6027 }; 6024 static const int coeff_abs_level_m1_offset[6] = {6028 static const uint16_t coeff_abs_level_m1_offset[6] = { 6025 6029 227+0, 227+10, 227+20, 227+30, 227+39, 426 6026 6030 }; 6027 6031 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = { … … 6121 6125 } 6122 6126 assert(coeff_count > 0); 6123 6127 6124 if( cat == 0 ) 6128 switch ( cat ) { 6129 case 0: 6125 6130 h->cbp_table[mb_xy] |= 0x100; 6126 else if( cat == 1 || cat == 2 ) 6131 break; 6132 case 1: case 2: 6127 6133 h->non_zero_count_cache[scan8[n]] = coeff_count; 6128 else if( cat == 3 ) 6134 break; 6135 case 3: 6129 6136 h->cbp_table[mb_xy] |= 0x40 << n; 6130 else if( cat == 4 ) 6137 break; 6138 case 4: 6131 6139 h->non_zero_count_cache[scan8[16+n]] = coeff_count; 6132 else { 6140 break; 6141 default: 6133 6142 assert( cat == 5 ); 6134 6143 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1); 6135 6144 } 6136 6145 6137 for( coeff_count--; coeff_count >= 0;coeff_count-- ) {6146 while ( coeff_count-- ) { 6138 6147 uint8_t *ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 )) + abs_level_m1_ctx_base; 6139 6148 int j= scantable[index[coeff_count]]; 6140 6149 6141 6150 if( get_cabac( CC, ctx ) == 0 ) { 6151 int sign = get_cabac_bypass_sign( CC, qmul ? -qmul[j] : -1 ); 6152 6142 6153 if( !qmul ) { 6143 block[j] = get_cabac_bypass_sign( CC, -1);6154 block[j] = sign; 6144 6155 }else{ 6145 block[j] = ( get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;;6156 block[j] = (sign + 32) >> 6; 6146 6157 } 6147 6158 6148 6159 abslevel1++; -
cabac.h
old new 632 632 633 633 634 634 static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){ 635 #if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))635 #if 0 636 636 asm volatile( 637 637 "movl "RANGE "(%1), %%ebx \n\t" 638 638 "movl "LOW "(%1), %%eax \n\t"
