]> granicus.if.org Git - libvpx/commitdiff
vp9-svc: Non-rd pickmode, fix condition for testing zeromv for spatial ref.
authorMarco <marpan@google.com>
Mon, 7 Mar 2016 17:50:36 +0000 (09:50 -0800)
committerMarco <marpan@google.com>
Mon, 7 Mar 2016 17:55:25 +0000 (09:55 -0800)
Change-Id: I75bad321d5814a6df6735a8ead7700ab93b50763

vp9/encoder/vp9_pickmode.c

index d861f8096713d3ebd3e55018588401dbaa64242a..e53917f6c6f57b66922cece0b25dfc8db322abd4 100644 (file)
@@ -1279,14 +1279,21 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
     usable_ref_frame = GOLDEN_FRAME;
   }
 
-  // If the reference is temporally aligned with current superframe
-  // (e.g., spatial reference within superframe), constrain the inter mode:
-  // for now only test zero motion.
-  if (cpi->use_svc && svc ->force_zero_mode_spatial_ref) {
-    if (svc->ref_frame_index[cpi->lst_fb_idx] == svc->current_superframe)
-      svc_force_zero_mode[LAST_FRAME - 1] = 1;
-    if (svc->ref_frame_index[cpi->gld_fb_idx] == svc->current_superframe)
-      svc_force_zero_mode[GOLDEN_FRAME - 1] = 1;
+  // For svc mode, on spatial_layer_id > 0: if the reference has different scale
+  // constrain the inter mode to only test zero motion.
+  if (cpi->use_svc &&
+      svc ->force_zero_mode_spatial_ref &&
+      cpi->svc.spatial_layer_id > 0) {
+    if (cpi->ref_frame_flags & flag_list[LAST_FRAME]) {
+      struct scale_factors *const sf = &cm->frame_refs[LAST_FRAME - 1].sf;
+      if (vp9_is_scaled(sf))
+        svc_force_zero_mode[LAST_FRAME - 1] = 1;
+    }
+    if (cpi->ref_frame_flags & flag_list[GOLDEN_FRAME]) {
+      struct scale_factors *const sf = &cm->frame_refs[GOLDEN_FRAME - 1].sf;
+      if (vp9_is_scaled(sf))
+        svc_force_zero_mode[GOLDEN_FRAME - 1] = 1;
+    }
   }
 
   for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) {