rv40: don't always do the full prev_type search
authorChristophe Gisquet <christophe.gisquet@gmail.com>
Tue, 17 Apr 2012 18:44:48 +0000 (18:44 +0000)
committerRonald S. Bultje <rsbultje@gmail.com>
Sat, 28 Apr 2012 18:06:05 +0000 (11:06 -0700)
120->100 cycles.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
libavcodec/rv40.c

index b65a2005f086c1d05925547e7215f110cc795eae..18dd51e8716d85aa7b98337cdcdffa7df0876deb 100644 (file)
@@ -228,8 +228,6 @@ static int rv40_decode_mb_info(RV34DecContext *r)
     int q, i;
     int prev_type = 0;
     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
-    int blocks[RV34_MB_TYPES] = {0};
-    int count = 0;
 
     if(!r->s.mb_skip_run)
         r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
@@ -237,22 +235,27 @@ static int rv40_decode_mb_info(RV34DecContext *r)
     if(--r->s.mb_skip_run)
          return RV34_MB_SKIP;
 
-    if(r->avail_cache[6-1])
-        blocks[r->mb_type[mb_pos - 1]]++;
     if(r->avail_cache[6-4]){
+        int blocks[RV34_MB_TYPES] = {0};
+        int count = 0;
+        if(r->avail_cache[6-1])
+            blocks[r->mb_type[mb_pos - 1]]++;
         blocks[r->mb_type[mb_pos - s->mb_stride]]++;
         if(r->avail_cache[6-2])
             blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++;
         if(r->avail_cache[6-5])
             blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++;
-    }
-
-    for(i = 0; i < RV34_MB_TYPES; i++){
-        if(blocks[i] > count){
-            count = blocks[i];
-            prev_type = i;
+        for(i = 0; i < RV34_MB_TYPES; i++){
+            if(blocks[i] > count){
+                count = blocks[i];
+                prev_type = i;
+                if(count>1)
+                    break;
+            }
         }
-    }
+    } else if (r->avail_cache[6-1])
+        prev_type = r->mb_type[mb_pos - 1];
+
     if(s->pict_type == AV_PICTURE_TYPE_P){
         prev_type = block_num_to_ptype_vlc_num[prev_type];
         q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);