Ticket #113: ffmpeg-simpler-cabacresid.diff

File ffmpeg-simpler-cabacresid.diff, 3.5 kB (added by astrange, 2 years ago)

Cleanup decode_cabac_residual (on x86, at least). Needs more work, the int[64] array looks like it could be a char[64] array but I didn't want to rewrite any asm.

  • h264.c

    old new  
    59805980    int nza, nzb; 
    59815981    int ctx = 0; 
    59825982 
    5983     if( cat == 0 ) { 
     5983    switch ( cat ) { 
     5984    case 0: 
    59845985        nza = h->left_cbp&0x100; 
    59855986        nzb = h-> top_cbp&0x100; 
    5986     } else if( cat == 1 || cat == 2 ) { 
     5987        break; 
     5988    case 1: case 2: 
    59875989        nza = h->non_zero_count_cache[scan8[idx] - 1]; 
    59885990        nzb = h->non_zero_count_cache[scan8[idx] - 8]; 
    5989     } else if( cat == 3 ) { 
     5991        break; 
     5992    case 3: 
    59905993        nza = (h->left_cbp>>(6+idx))&0x01; 
    59915994        nzb = (h-> top_cbp>>(6+idx))&0x01; 
    5992     } else { 
     5995        break; 
     5996    default: 
    59935997        assert(cat == 4); 
    59945998        nza = h->non_zero_count_cache[scan8[16+idx] - 1]; 
    59955999        nzb = h->non_zero_count_cache[scan8[16+idx] - 8]; 
     
    60136017 
    60146018static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff) { 
    60156019    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] = { 
    60176021      { 105+0, 105+15, 105+29, 105+44, 105+47, 402 }, 
    60186022      { 277+0, 277+15, 277+29, 277+44, 277+47, 436 } 
    60196023    }; 
    6020     static const int last_coeff_flag_offset[2][6] = { 
     6024    static const uint16_t last_coeff_flag_offset[2][6] = { 
    60216025      { 166+0, 166+15, 166+29, 166+44, 166+47, 417 }, 
    60226026      { 338+0, 338+15, 338+29, 338+44, 338+47, 451 } 
    60236027    }; 
    6024     static const int coeff_abs_level_m1_offset[6] = { 
     6028    static const uint16_t coeff_abs_level_m1_offset[6] = { 
    60256029        227+0, 227+10, 227+20, 227+30, 227+39, 426 
    60266030    }; 
    60276031    static const uint8_t significant_coeff_flag_offset_8x8[2][63] = { 
     
    61216125    } 
    61226126    assert(coeff_count > 0); 
    61236127 
    6124     if( cat == 0 ) 
     6128    switch ( cat ) { 
     6129    case 0: 
    61256130        h->cbp_table[mb_xy] |= 0x100; 
    6126     else if( cat == 1 || cat == 2 ) 
     6131        break; 
     6132    case 1: case 2: 
    61276133        h->non_zero_count_cache[scan8[n]] = coeff_count; 
    6128     else if( cat == 3 ) 
     6134        break; 
     6135    case 3: 
    61296136        h->cbp_table[mb_xy] |= 0x40 << n; 
    6130     else if( cat == 4 ) 
     6137        break; 
     6138    case 4: 
    61316139        h->non_zero_count_cache[scan8[16+n]] = coeff_count; 
    6132     else { 
     6140        break; 
     6141    default: 
    61336142        assert( cat == 5 ); 
    61346143        fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1); 
    61356144    } 
    61366145 
    6137     for( coeff_count--; coeff_count >= 0; coeff_count-- ) { 
     6146    while ( coeff_count-- ) { 
    61386147        uint8_t *ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 )) + abs_level_m1_ctx_base; 
    61396148        int j= scantable[index[coeff_count]]; 
    61406149 
    61416150        if( get_cabac( CC, ctx ) == 0 ) { 
     6151            int sign = get_cabac_bypass_sign( CC, qmul ? -qmul[j] : -1 ); 
     6152             
    61426153            if( !qmul ) { 
    6143                 block[j] = get_cabac_bypass_sign( CC, -1)
     6154                block[j] = sign
    61446155            }else{ 
    6145                 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;
     6156                block[j] = (sign + 32) >> 6
    61466157            } 
    61476158 
    61486159            abslevel1++; 
  • cabac.h

    old new  
    632632 
    633633 
    634634static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){ 
    635 #if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) 
     635#if 0 
    636636    asm volatile( 
    637637        "movl "RANGE    "(%1), %%ebx            \n\t" 
    638638        "movl "LOW      "(%1), %%eax            \n\t"