ref: 254e2f5501d000ca66bc65c5f44bb6a882d4167c
parent: e14e9c99640636040d4c0bebd01d8f9c22d4650e
author: Jerome Jiang <jianj@google.com>
date: Mon Jan 29 11:38:28 EST 2018
vp9 svc: fix to make top layer frame non-ref Add mismatch check to the datarate test of changing svc pattern on the fly. Change-Id: I6a878736de44e6a40c077ed6430aabd7fadabdd9
--- a/examples/vp9_spatial_svc_encoder.c
+++ b/examples/vp9_spatial_svc_encoder.c
@@ -589,6 +589,10 @@
} else {
ref_frame_config->frame_flags[sl] =
VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF;
+ if (sl == num_spatial_layers - 1)
+ ref_frame_config->frame_flags[sl] =
+ VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_ARF |
+ VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF;
}
}
if (tl == 0) {
--- a/test/datarate_test.cc
+++ b/test/datarate_test.cc
@@ -1879,6 +1879,13 @@
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
CheckLayerRateTargeting(&cfg_, number_spatial_layers_,
number_temporal_layers_, file_datarate_, 0.78, 1.15);
+#if CONFIG_VP9_DECODER
+ // Number of temporal layers > 1, so half of the frames in this SVC pattern
+ // will be non-reference frame and hence encoder will avoid loopfilter.
+ // Since frame dropper is off, we can expect 200 (half of the sequence)
+ // mismatched frames.
+ EXPECT_EQ(static_cast<unsigned int>(200), GetMismatchFrames());
+#endif
}
// Check basic rate targeting for 1 pass CBR SVC with 3 spatial layers and on
--- a/vp9/encoder/vp9_svc_layercontext.c
+++ b/vp9/encoder/vp9_svc_layercontext.c
@@ -549,6 +549,8 @@
if (!spatial_id) {
cpi->ref_frame_flags = VP9_LAST_FLAG;
} else {
+ if (spatial_id == cpi->svc.number_spatial_layers - 1)
+ cpi->ext_refresh_alt_ref_frame = 0;
cpi->ref_frame_flags = VP9_LAST_FLAG | VP9_GOLD_FLAG;
}
}