Merge decode_cabac_mb_dqp() with surronding code.

~20 cpu cycles faster

Originally committed as revision 21826 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2010-02-14 23:06:25 +00:00
parent 94cb599443
commit f4b8b82514
2 changed files with 24 additions and 22 deletions

View File

@ -2196,6 +2196,8 @@ static void loop_filter(H264Context *h){
h->slice_type= old_slice_type; h->slice_type= old_slice_type;
s->mb_x= 0; s->mb_x= 0;
s->mb_y= end_mb_y - FRAME_MBAFF; s->mb_y= end_mb_y - FRAME_MBAFF;
h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
} }
static int decode_slice(struct AVCodecContext *avctx, void *arg){ static int decode_slice(struct AVCodecContext *avctx, void *arg){

View File

@ -898,22 +898,7 @@ static int decode_cabac_mb_cbp_chroma( H264Context *h) {
if( cbp_b == 2 ) ctx += 2; if( cbp_b == 2 ) ctx += 2;
return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ); return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
} }
static int decode_cabac_mb_dqp( H264Context *h) {
int ctx= h->last_qscale_diff != 0;
int val = 0;
while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
ctx= 2+(ctx>>1);
val++;
if(val > 102) //prevent infinite loop
return INT_MIN;
}
if( val&0x01 )
return (val + 1)>>1 ;
else
return -((val + 1)>>1);
}
static int decode_cabac_p_mb_sub_type( H264Context *h ) { static int decode_cabac_p_mb_sub_type( H264Context *h ) {
if( get_cabac( &h->cabac, &h->cabac_state[21] ) ) if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
return 0; /* 8x8 */ return 0; /* 8x8 */
@ -1672,7 +1657,6 @@ decode_intra_mb:
if( cbp || IS_INTRA16x16( mb_type ) ) { if( cbp || IS_INTRA16x16( mb_type ) ) {
const uint8_t *scan, *scan8x8, *dc_scan; const uint8_t *scan, *scan8x8, *dc_scan;
const uint32_t *qmul; const uint32_t *qmul;
int dqp;
if(IS_INTERLACED(mb_type)){ if(IS_INTERLACED(mb_type)){
scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
@ -1684,18 +1668,34 @@ decode_intra_mb:
dc_scan= luma_dc_zigzag_scan; dc_scan= luma_dc_zigzag_scan;
} }
h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h ); // decode_cabac_mb_dqp
if( dqp == INT_MIN ){ if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); int val = 1;
return -1; int ctx= 2;
}
s->qscale += dqp; while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
ctx= 3;
val++;
if(val > 102){ //prevent infinite loop
av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
return -1;
}
}
if( val&0x01 )
val= (val + 1)>>1 ;
else
val= -((val + 1)>>1);
h->last_qscale_diff = val;
s->qscale += val;
if(((unsigned)s->qscale) > 51){ if(((unsigned)s->qscale) > 51){
if(s->qscale<0) s->qscale+= 52; if(s->qscale<0) s->qscale+= 52;
else s->qscale-= 52; else s->qscale-= 52;
} }
h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
}else
h->last_qscale_diff=0;
if( IS_INTRA16x16( mb_type ) ) { if( IS_INTRA16x16( mb_type ) ) {
int i; int i;