]> granicus.if.org Git - libvpx/commitdiff
SEG_LVL_MODE: don't code ref_frame if it's implicit
authorJohn Koleszar <jkoleszar@google.com>
Tue, 13 Nov 2012 23:18:47 +0000 (15:18 -0800)
committerJohn Koleszar <jkoleszar@google.com>
Tue, 13 Nov 2012 23:22:09 +0000 (15:22 -0800)
If the SEG_LVL_MODE is an intra mode, then the reference frame must be
INTRA_FRAME.

Change-Id: I2cdeeac3780c077c74b39ce89a528bc280674231

vp9/decoder/decodemv.c
vp9/encoder/bitstream.c

index e9f37958ce121ed5b8845f881d5c44452b75bda2..e7560765a92b76172dfcbc9bde8b230672d17558 100644 (file)
@@ -717,7 +717,11 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
   }
 
   // Read the reference frame
-  mbmi->ref_frame = read_ref_frame(pbi, bc, mbmi->segment_id);
+  if (vp9_segfeature_active(xd, mbmi->segment_id, SEG_LVL_MODE)
+      && vp9_get_segdata(xd, mbmi->segment_id, SEG_LVL_MODE) < NEARESTMV)
+    mbmi->ref_frame = INTRA_FRAME;
+  else
+    mbmi->ref_frame = read_ref_frame(pbi, bc, mbmi->segment_id);
 
   // If reference frame is an Inter frame
   if (mbmi->ref_frame) {
index d88cfd0554c6a52669dc3fd0fd4402ef759d7916..65614a176b282142984e4c3474c1371b5a8b434e 100644 (file)
@@ -863,7 +863,12 @@ static void pack_inter_mode_mvs(VP9_COMP *const cpi, vp9_writer *const bc) {
         }
 
         // Encode the reference frame.
-        encode_ref_frame(bc, pc, xd, segment_id, rf);
+        if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_MODE)
+            || vp9_get_segdata(xd, segment_id, SEG_LVL_MODE) >= NEARESTMV) {
+          encode_ref_frame(bc, pc, xd, segment_id, rf);
+        } else {
+          assert(rf == INTRA_FRAME);
+        }
 
         if (rf == INTRA_FRAME) {
 #ifdef ENTROPY_STATS