# HG changeset patch # User michael # Date 1229964377 0 # Node ID 59171c70bc9f79d86b64b80ef06f6c7c4e357bc7 # Parent adab508880c6b16205c7a40e7d6ad8a5d62292bd inline decode_cabac_mb_type for I & P frames, 9 cycles faster on pentium dual. diff -r adab508880c6 -r 59171c70bc9f h264.c --- a/h264.c Mon Dec 22 16:20:13 2008 +0000 +++ b/h264.c Mon Dec 22 16:46:17 2008 +0000 @@ -4777,25 +4777,9 @@ return mb_type; } -static int decode_cabac_mb_type( H264Context *h ) { +static int decode_cabac_mb_type_b( H264Context *h ) { MpegEncContext * const s = &h->s; - if( h->slice_type_nos == FF_I_TYPE ) { - return decode_cabac_intra_mb_type(h, 3, 1); - } else if( h->slice_type_nos == FF_P_TYPE ) { - if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) { - /* P-type */ - if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) { - /* P_L0_D16x16, P_8x8 */ - return 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] ); - } else { - /* P_L0_D8x16, P_L0_D16x8 */ - return 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] ); - } - } else { - return decode_cabac_intra_mb_type(h, 17, 0) + 5; - } - } else { const int mba_xy = h->left_mb_xy[0]; const int mbb_xy = h->top_mb_xy; int ctx = 0; @@ -4829,7 +4813,6 @@ bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */ - } } static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { @@ -5365,10 +5348,9 @@ h->prev_mb_skipped = 0; compute_mb_neighbors(h); - mb_type = decode_cabac_mb_type( h ); - assert(mb_type >= 0); if( h->slice_type_nos == FF_B_TYPE ) { + mb_type = decode_cabac_mb_type_b( h ); if( mb_type < 23 ){ partition_count= b_mb_type_info[mb_type].partition_count; mb_type= b_mb_type_info[mb_type].type; @@ -5377,14 +5359,23 @@ goto decode_intra_mb; } } else if( h->slice_type_nos == FF_P_TYPE ) { - if( mb_type < 5) { + if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) { + /* P-type */ + if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) { + /* P_L0_D16x16, P_8x8 */ + mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] ); + } else { + /* P_L0_D8x16, P_L0_D16x8 */ + mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] ); + } partition_count= p_mb_type_info[mb_type].partition_count; mb_type= p_mb_type_info[mb_type].type; } else { - mb_type -= 5; + mb_type= decode_cabac_intra_mb_type(h, 17, 0); goto decode_intra_mb; } } else { + mb_type= decode_cabac_intra_mb_type(h, 3, 1); if(h->slice_type == FF_SI_TYPE && mb_type) mb_type--; assert(h->slice_type_nos == FF_I_TYPE);