VP8: unroll MB mode decoding tree
[ffmpeg.git] / libavcodec / vp8.c
index aa9a69c..af18b0d 100644 (file)
@@ -745,7 +745,6 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_
     } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) {
         VP56mv near[2], best;
         uint8_t cnt[4] = { 0 };
-        uint8_t p[4];
 
         // inter MB, 16.2
         if (vp56_rac_get_prob_branchy(c, s->prob->last))
@@ -757,30 +756,30 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_
 
         // motion vectors, 16.3
         find_near_mvs(s, mb, mb_x, mb_y, near, &best, cnt);
-        p[0] = vp8_mode_contexts[cnt[0]][0];
-        p[1] = vp8_mode_contexts[cnt[1]][1];
-        p[2] = vp8_mode_contexts[cnt[2]][2];
-        p[3] = vp8_mode_contexts[cnt[3]][3];
-        mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_mvinter, p);
-        switch (mb->mode) {
-        case VP8_MVMODE_SPLIT:
-            clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
-            mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1];
-            break;
-        case VP8_MVMODE_ZERO:
+        if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[0]][0])) {
+            if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[1]][1])) {
+                if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[2]][2])) {
+                    if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[3]][3])) {
+                        mb->mode = VP8_MVMODE_SPLIT;
+                        clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
+                        mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1];
+                    } else {
+                        mb->mode = VP8_MVMODE_NEW;
+                        clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
+                        mb->mv.y += + read_mv_component(c, s->prob->mvc[0]);
+                        mb->mv.x += + read_mv_component(c, s->prob->mvc[1]);
+                    }
+                } else {
+                    mb->mode = VP8_MVMODE_NEAR;
+                    clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
+                }
+            } else {
+                mb->mode = VP8_MVMODE_NEAREST;
+                clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
+            }
+        } else {
+            mb->mode = VP8_MVMODE_ZERO;
             AV_ZERO32(&mb->mv);
-            break;
-        case VP8_MVMODE_NEAREST:
-            clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
-            break;
-        case VP8_MVMODE_NEAR:
-            clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
-            break;
-        case VP8_MVMODE_NEW:
-            clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
-            mb->mv.y += + read_mv_component(c, s->prob->mvc[0]);
-            mb->mv.x += + read_mv_component(c, s->prob->mvc[1]);
-            break;
         }
         if (mb->mode != VP8_MVMODE_SPLIT) {
             mb->partitioning = VP8_SPLITMVMODE_NONE;