From cfc9a1727ac8e3209f5212c68778962db8bebbdf Mon Sep 17 00:00:00 2001
From: Luca Barbato <lu_zero@gentoo.org>
Date: Sat, 15 Sep 2018 22:38:29 +0000
Subject: [PATCH] Add NEAR1MV and NEAR2MV only when the mv_stack has enough mv

---
 src/predict.rs |  4 +---
 src/rdo.rs     | 20 +++++++++++---------
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/predict.rs b/src/predict.rs
index 7b185e2f..1a01683f 100755
--- a/src/predict.rs
+++ b/src/predict.rs
@@ -41,12 +41,10 @@ pub static RAV1E_INTRA_MODES_MINIMAL: &'static [PredictionMode] = &[
     PredictionMode::V_PRED
 ];
 
-pub static RAV1E_INTER_MODES: &'static [PredictionMode] = &[
+pub static RAV1E_INTER_MODES_MINIMAL: &'static [PredictionMode] = &[
   PredictionMode::GLOBALMV,
   PredictionMode::NEARESTMV,
   PredictionMode::NEAR0MV,
-  PredictionMode::NEAR1MV,
-  PredictionMode::NEAR2MV,
   PredictionMode::NEWMV
 ];
 
diff --git a/src/rdo.rs b/src/rdo.rs
index ac35ac65..fdf11822 100755
--- a/src/rdo.rs
+++ b/src/rdo.rs
@@ -23,7 +23,7 @@ use motion_compensate;
 use partition::*;
 use plane::*;
 use cdef::*;
-use predict::{RAV1E_INTRA_MODES, RAV1E_INTRA_MODES_MINIMAL, RAV1E_INTER_MODES};
+use predict::{RAV1E_INTRA_MODES, RAV1E_INTRA_MODES_MINIMAL, RAV1E_INTER_MODES_MINIMAL};
 use quantize::dc_q;
 use std;
 use std::f64;
@@ -303,23 +303,25 @@ pub fn rdo_mode_decision(
   };
 
   let mut mode_set: Vec<PredictionMode> = Vec::new();
+  let mut mv_stack = Vec::new();
+  let mode_context =
+    cw.find_mvrefs(bo, LAST_FRAME, &mut mv_stack, bsize, false);
 
   if fi.frame_type == FrameType::INTER {
-    mode_set.extend_from_slice(RAV1E_INTER_MODES);
+    mode_set.extend_from_slice(RAV1E_INTER_MODES_MINIMAL);
+    if mv_stack.len() >= 3 {
+        mode_set.push(PredictionMode::NEAR1MV);
+    }
+    if mv_stack.len() >= 4 {
+        mode_set.push(PredictionMode::NEAR2MV);
+    }
   }
   mode_set.extend_from_slice(intra_mode_set);
 
-  let mut mv_stack = Vec::new();
-  let mode_context =
-    cw.find_mvrefs(bo, LAST_FRAME, &mut mv_stack, bsize, false);
-
   mode_set.iter().for_each(|&luma_mode| {
     let luma_mode_is_intra = luma_mode.is_intra();
     assert!(fi.frame_type == FrameType::INTER || luma_mode_is_intra);
 
-    if luma_mode == PredictionMode::NEAR1MV && mv_stack.len() < 3 { return; }
-    if luma_mode == PredictionMode::NEAR2MV && mv_stack.len() < 4 { return; }
-
     let mut mode_set_chroma = vec![luma_mode];
 
     if luma_mode_is_intra && is_chroma_block {
-- 
GitLab