summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_encodeframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/encoder/vp9_encodeframe.c')
-rw-r--r--vp9/encoder/vp9_encodeframe.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index bf87a2663..164643558 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1255,13 +1255,17 @@ static int choose_partitioning(VP9_COMP *cpi, const TileInfo *const tile,
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);