Optimize decode_cabac_field_decoding_flag().

~4 cpu cycles faster

Originally committed as revision 21447 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Michael Niedermayer 15 years ago
parent 7f8c3d1f4d
commit 2773920698
  1. 18
      libavcodec/h264_cabac.c

@ -706,21 +706,15 @@ void ff_h264_init_cabac_states(H264Context *h) {
static int decode_cabac_field_decoding_flag(H264Context *h) { static int decode_cabac_field_decoding_flag(H264Context *h) {
MpegEncContext * const s = &h->s; MpegEncContext * const s = &h->s;
const int mb_x = s->mb_x; const long mba_xy = h->mb_xy - 1L;
const int mb_y = s->mb_y & ~1; const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
const int mba_xy = mb_x - 1 + mb_y *s->mb_stride;
const int mbb_xy = mb_x + (mb_y-2)*s->mb_stride;
unsigned int ctx = 0; unsigned long ctx = 0;
if( h->slice_table[mba_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) { ctx += (s->current_picture.mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h->slice_num);
ctx += 1; ctx += (s->current_picture.mb_type[mbb_xy]>>7)&(h->slice_table[mbb_xy] == h->slice_num);
}
if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) {
ctx += 1;
}
return get_cabac_noinline( &h->cabac, &h->cabac_state[70 + ctx] ); return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
} }
static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) { static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {

Loading…
Cancel
Save