shithub: libvpx

Download patch

ref: 5baf510f74ca2fe82ea5aa547b1330d4c5059581
parent: 039b0c4c9ed685df11bfa9193426d01a55c7ead3
parent: d8286dd56d4aaca538c0b68c7612aa2485bb20da
author: Dmitry Kovalev <dkovalev@google.com>
date: Tue Aug 20 06:06:14 EDT 2013

Merge "Adding has_second_ref function."

--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -161,8 +161,12 @@
   union b_mode_info bmi[4];
 } MODE_INFO;
 
-static int is_inter_block(const MB_MODE_INFO *mbmi) {
+static INLINE int is_inter_block(const MB_MODE_INFO *mbmi) {
   return mbmi->ref_frame[0] > INTRA_FRAME;
+}
+
+static INLINE int has_second_ref(const MB_MODE_INFO *mbmi) {
+  return mbmi->ref_frame[1] > INTRA_FRAME;
 }
 
 enum mv_precision {
--- a/vp9/common/vp9_pred_common.c
+++ b/vp9/common/vp9_pred_common.c
@@ -216,52 +216,53 @@
   // left of the entries correpsonding to real macroblocks.
   // The prediction flags in these dummy entries are initialised to 0.
   if (above_in_image && left_in_image) {  // both edges available
-    if (above_intra && left_intra) {
+    if (above_intra && left_intra) {  // intra/intra
       pred_context = 2;
-    } else if (above_intra || left_intra) {
+    } else if (above_intra || left_intra) {  // intra/inter or inter/intra
       const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi;
-
-      if (edge_mbmi->ref_frame[1] <= INTRA_FRAME)
+      if (!has_second_ref(edge_mbmi))
         pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME);
       else
         pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME ||
                             edge_mbmi->ref_frame[1] == LAST_FRAME);
-    } else if (above_mbmi->ref_frame[1] <= INTRA_FRAME &&
-               left_mbmi->ref_frame[1] <= INTRA_FRAME) {
-      pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) +
-                     2 * (left_mbmi->ref_frame[0] == LAST_FRAME);
-    } else if (above_mbmi->ref_frame[1] > INTRA_FRAME &&
-               left_mbmi->ref_frame[1] > INTRA_FRAME) {
-      pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME ||
-                          above_mbmi->ref_frame[1] == LAST_FRAME ||
-                          left_mbmi->ref_frame[0] == LAST_FRAME ||
-                          left_mbmi->ref_frame[1] == LAST_FRAME);
-    } else {
-      MV_REFERENCE_FRAME rfs = above_mbmi->ref_frame[1] <= INTRA_FRAME ?
-              above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
-      MV_REFERENCE_FRAME crf1 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
-              above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
-      MV_REFERENCE_FRAME crf2 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
-              above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
+    } else {  // inter/inter
+      if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) {
+        pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) +
+                       2 * (left_mbmi->ref_frame[0] == LAST_FRAME);
+      } else if (has_second_ref(above_mbmi) && has_second_ref(left_mbmi)) {
+        pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME ||
+                            above_mbmi->ref_frame[1] == LAST_FRAME ||
+                            left_mbmi->ref_frame[0] == LAST_FRAME ||
+                            left_mbmi->ref_frame[1] == LAST_FRAME);
+      } else {
+        const MV_REFERENCE_FRAME rfs = !has_second_ref(above_mbmi) ?
+                  above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
+        const MV_REFERENCE_FRAME crf1 = has_second_ref(above_mbmi) ?
+                  above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
+        const MV_REFERENCE_FRAME crf2 = has_second_ref(above_mbmi) ?
+                  above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
 
-      if (rfs == LAST_FRAME)
-        pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME);
-      else
-        pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME;
+        if (rfs == LAST_FRAME)
+          pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME);
+        else
+          pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME;
+      }
     }
   } else if (above_in_image || left_in_image) {  // one edge available
     const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
-
-    if (edge_mbmi->ref_frame[0] == INTRA_FRAME)
+    if (!is_inter_block(edge_mbmi)) {  // intra
       pred_context = 2;
-    else if (edge_mbmi->ref_frame[1] <= INTRA_FRAME)
-      pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME);
-    else
-      pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME ||
-                          edge_mbmi->ref_frame[1] == LAST_FRAME);
-  } else {  // no edges available (2)
+    } else {  // inter
+      if (!has_second_ref(edge_mbmi))
+        pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME);
+      else
+        pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME ||
+                            edge_mbmi->ref_frame[1] == LAST_FRAME);
+    }
+  } else {  // no edges available
     pred_context = 2;
   }
+
   assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
   return pred_context;
 }