[FFmpeg-cvslog] r21447 - trunk/libavcodec/h264_cabac.c

michael subversion
Mon Jan 25 03:44:34 CET 2010


Author: michael
Date: Mon Jan 25 03:44:34 2010
New Revision: 21447

Log:
Optimize decode_cabac_field_decoding_flag().
~4 cpu cycles faster

Modified:
   trunk/libavcodec/h264_cabac.c

Modified: trunk/libavcodec/h264_cabac.c
==============================================================================
--- trunk/libavcodec/h264_cabac.c	Mon Jan 25 03:03:10 2010	(r21446)
+++ trunk/libavcodec/h264_cabac.c	Mon Jan 25 03:44:34 2010	(r21447)
@@ -706,21 +706,15 @@ void ff_h264_init_cabac_states(H264Conte
 
 static int decode_cabac_field_decoding_flag(H264Context *h) {
     MpegEncContext * const s = &h->s;
-    const int mb_x = s->mb_x;
-    const int mb_y = s->mb_y & ~1;
-    const int mba_xy = mb_x - 1 +  mb_y   *s->mb_stride;
-    const int mbb_xy = mb_x     + (mb_y-2)*s->mb_stride;
+    const long mba_xy = h->mb_xy - 1L;
+    const long mbb_xy = h->mb_xy - 2L*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 += 1;
-    }
-    if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) {
-        ctx += 1;
-    }
+    ctx += (s->current_picture.mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h->slice_num);
+    ctx += (s->current_picture.mb_type[mbb_xy]>>7)&(h->slice_table[mbb_xy] == h->slice_num);
 
-    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) {



More information about the ffmpeg-cvslog mailing list