From 6d3bd966075fdb76e415095f6165d0541f4bd0d8 Mon Sep 17 00:00:00 2001
From: Jingning Han <jingning@google.com>
Date: Fri, 27 Sep 2013 17:22:59 -0700
Subject: [PATCH] BITSTREAM - CLARIFICATION OF MV SIZE RANGE

The codec should effectively run with motion vector of range (-2048, 2047)
in full pixels, for sequences of 1080p and below. Add assertions to clarify
this behavior.

Change-Id: Ia0cac28249f587d8f8882205228fa480263ab313
---
 vp9/common/vp9_entropymv.h |  4 ++++
 vp9/decoder/vp9_decodemv.c | 14 +++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/vp9/common/vp9_entropymv.h b/vp9/common/vp9_entropymv.h
index 5018c20131..3b782ab0a4 100644
--- a/vp9/common/vp9_entropymv.h
+++ b/vp9/common/vp9_entropymv.h
@@ -73,6 +73,10 @@ extern struct vp9_token vp9_mv_class_encodings[MV_CLASSES];
 #define MV_MAX         ((1 << MV_MAX_BITS) - 1)
 #define MV_VALS        ((MV_MAX << 1) + 1)
 
+#define MV_IN_USE_BITS 14
+#define MV_UPP   ((1 << MV_IN_USE_BITS) - 1)
+#define MV_LOW   (-(1 << MV_IN_USE_BITS))
+
 extern const vp9_tree_index vp9_mv_class0_tree[2 * CLASS0_SIZE - 2];
 extern struct vp9_token vp9_mv_class0_encodings[CLASS0_SIZE];
 
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index c697d665dc..18e6ea0ef8 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -522,8 +522,14 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi,
             assert(!"Invalid inter mode value");
         }
         mi->bmi[j].as_mv[0].as_int = block[0].as_int;
-        if (is_compound)
+        assert(block[0].as_mv.row < MV_UPP && block[0].as_mv.row > MV_LOW);
+        assert(block[0].as_mv.col < MV_UPP && block[0].as_mv.col > MV_LOW);
+
+        if (is_compound) {
           mi->bmi[j].as_mv[1].as_int = block[1].as_int;
+          assert(block[1].as_mv.row < MV_UPP && block[1].as_mv.row > MV_LOW);
+          assert(block[1].as_mv.col < MV_UPP && block[1].as_mv.col > MV_LOW);
+        }
 
         if (num_4x4_h == 2)
           mi->bmi[j + 2] = mi->bmi[j];
@@ -564,6 +570,12 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi,
       default:
         assert(!"Invalid inter mode value");
     }
+    assert(mv0->as_mv.row < MV_UPP && mv0->as_mv.row > MV_LOW);
+    assert(mv0->as_mv.col < MV_UPP && mv0->as_mv.col > MV_LOW);
+    if (is_compound) {
+      assert(mv1->as_mv.row < MV_UPP && mv1->as_mv.row > MV_LOW);
+      assert(mv1->as_mv.col < MV_UPP && mv1->as_mv.col > MV_LOW);
+    }
   }
 }
 
-- 
GitLab