shithub: libvpx

Download patch

ref: 933619766383f9797d0486f8f3c5f00060a48a5f
parent: 742e93f030ec66d01930de0697c1896a7d5c128e
parent: c9b6c5d5ad8b03e32c0e44959cbb74468dd81cbf
author: Marco Paniconi <marpan@google.com>
date: Wed Apr 4 01:59:00 EDT 2018

Merge "vp9-svc: Fix in choose_partitioning for different scaling."

--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1255,13 +1255,17 @@
   int segment_id;
   int sb_offset = (cm->mi_stride >> 3) * (mi_row >> 3) + (mi_col >> 3);
 
-  // For SVC: check if LAST frame is NULL and if so treat this frame as a key
-  // frame, for the purpose of the superblock partitioning. This can happen
-  // (LAST is NULL) in some cases where enhancement spatial layers are enabled
-  // dyanmically in the stream and the only reference is the spatial
+  // For SVC: check if LAST frame is NULL or if the resolution of LAST is
+  // different than the current frame resolution, and if so, treat this frame
+  // as a key frame, for the purpose of the superblock partitioning.
+  // LAST == NULL can happen in some cases where enhancement spatial layers are
+  // enabled dyanmically in the stream and the only reference is the spatial
   // reference (GOLDEN).
   if (cpi->use_svc) {
-    if (get_ref_frame_buffer(cpi, LAST_FRAME) == NULL) is_key_frame = 1;
+    const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, LAST_FRAME);
+    if (ref == NULL || ref->y_crop_height != cm->height ||
+        ref->y_crop_width != cm->width)
+      is_key_frame = 1;
   }
 
   set_offsets(cpi, tile, x, mi_row, mi_col, BLOCK_64X64);