Ticket #113: ffmpeg-cbpluma-speed.diff

File ffmpeg-cbpluma-speed.diff, 1.9 KB (added by astrange, 8 years ago)

This patch SHOULD be an optimization, but it causes gcc to produce worse code elsewhere.

  • libavcodec/h264.c

     
    57615761        return 3; 
    57625762} 
    57635763 
    5764 static const uint8_t block_idx_x[16] = { 
    5765     0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3 
    5766 }; 
    5767 static const uint8_t block_idx_y[16] = { 
    5768     0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3 
    5769 }; 
    5770 static const uint8_t block_idx_xy[4][4] = { 
    5771     { 0, 2, 8,  10}, 
    5772     { 1, 3, 9,  11}, 
    5773     { 4, 6, 12, 14}, 
    5774     { 5, 7, 13, 15} 
    5775 }; 
    5776  
    57775764static int decode_cabac_mb_cbp_luma( H264Context *h) { 
    57785765    int cbp = 0; 
    57795766    int cbp_b = -1; 
     
    57895776        int x, y; 
    57905777        int ctx = 0; 
    57915778 
    5792         x = block_idx_x[4*i8x8]; 
    5793         y = block_idx_y[4*i8x8]; 
     5779        x = (i8x8 & 1) * 2; 
     5780        y = i8x8 & 2; 
    57945781 
    57955782        if( x > 0 ) 
    57965783            cbp_a = cbp; 
     
    58025789        if( y > 0 ) 
    58035790            cbp_b = cbp; 
    58045791 
     5792        #define block_idx_xy(r, c) ((((r) & 2) >> 1) + ((c) & 2)) 
     5793        #define lsb_is_zero(x)     (((x) & 1) ^ 1) 
     5794 
    58055795        /* No need to test for skip as we put 0 for skip block */ 
    58065796        /* No need to test for IPCM as we put 1 for IPCM block */ 
    58075797        if( cbp_a >= 0 ) { 
    5808             int i8x8a = block_idx_xy[(x-1)&0x03][y]/4; 
    5809             if( ((cbp_a >> i8x8a)&0x01) == 0 ) 
    5810                 ctx++; 
     5798            int i8x8a = block_idx_xy(x-1, y); 
     5799 
     5800            ctx = lsb_is_zero(cbp_a >> i8x8a); 
    58115801        } 
    58125802 
    58135803        if( cbp_b >= 0 ) { 
    5814             int i8x8b = block_idx_xy[x][(y-1)&0x03]/4; 
    5815             if( ((cbp_b >> i8x8b)&0x01) == 0 ) 
    5816                 ctx += 2; 
     5804            int i8x8b = block_idx_xy(x, y-1); 
     5805 
     5806            ctx += lsb_is_zero(cbp_b >> i8x8b) * 2; 
    58175807        } 
    58185808 
     5809       #undef block_idx_xy 
     5810       #undef lsb_is_zero 
     5811 
    58195812        if( get_cabac( &h->cabac, &h->cabac_state[73 + ctx] ) ) { 
    58205813            cbp |= 1 << i8x8; 
    58215814        }