diff --git a/src/modules/video_coding/codecs/vp8/temporal_layers.cc b/src/modules/video_coding/codecs/vp8/temporal_layers.cc index 9aa8dcb03..63874e031 100644 --- a/src/modules/video_coding/codecs/vp8/temporal_layers.cc +++ b/src/modules/video_coding/codecs/vp8/temporal_layers.cc @@ -85,13 +85,13 @@ bool TemporalLayers::ConfigureBitrates(int bitrateKbit, temporal_ids_, sizeof(unsigned int) * temporal_ids_length_); temporal_pattern_length_ = 8; - temporal_pattern_[0] = kTemporalUpdateLast; - temporal_pattern_[1] = kTemporalUpdateAltrefWithoutDependency; - temporal_pattern_[2] = kTemporalUpdateGoldenWithoutDependency; - temporal_pattern_[3] = kTemporalUpdateAltref; - temporal_pattern_[4] = kTemporalUpdateLast; - temporal_pattern_[5] = kTemporalUpdateAltref; - temporal_pattern_[6] = kTemporalUpdateGolden; + temporal_pattern_[0] = kTemporalUpdateLastAndGoldenRefAltRef; + temporal_pattern_[1] = kTemporalUpdateNoneNoRefGoldenRefAltRef; + temporal_pattern_[2] = kTemporalUpdateGoldenWithoutDependencyRefAltRef; + temporal_pattern_[3] = kTemporalUpdateNone; + temporal_pattern_[4] = kTemporalUpdateLastRefAltRef; + temporal_pattern_[5] = kTemporalUpdateNone; + temporal_pattern_[6] = kTemporalUpdateGoldenRefAltRef; temporal_pattern_[7] = kTemporalUpdateNone; break; case 4: @@ -184,6 +184,31 @@ int TemporalLayers::EncodeFlags() { flags |= VP8_EFLAG_NO_UPD_LAST; flags |= VP8_EFLAG_NO_UPD_ENTROPY; break; + case kTemporalUpdateNoneNoRefGoldenRefAltRef: + flags |= VP8_EFLAG_NO_REF_GF; + flags |= VP8_EFLAG_NO_UPD_GF; + flags |= VP8_EFLAG_NO_UPD_ARF; + flags |= VP8_EFLAG_NO_UPD_LAST; + flags |= VP8_EFLAG_NO_UPD_ENTROPY; + break; + case kTemporalUpdateGoldenWithoutDependencyRefAltRef: + flags |= VP8_EFLAG_NO_REF_GF; + flags |= VP8_EFLAG_NO_UPD_ARF; + flags |= VP8_EFLAG_NO_UPD_LAST; + break; + case kTemporalUpdateLastRefAltRef: + flags |= VP8_EFLAG_NO_UPD_GF; + flags |= VP8_EFLAG_NO_UPD_ARF; + flags |= VP8_EFLAG_NO_REF_GF; + break; + case kTemporalUpdateGoldenRefAltRef: + flags |= VP8_EFLAG_NO_UPD_ARF; + flags |= VP8_EFLAG_NO_UPD_LAST; + break; + case kTemporalUpdateLastAndGoldenRefAltRef: + flags |= VP8_EFLAG_NO_UPD_ARF; + flags |= VP8_EFLAG_NO_REF_GF; + break; } return flags; } @@ -204,6 +229,8 @@ void TemporalLayers::PopulateCodecSpecific(bool key_frame, if (temporal_reference == kTemporalUpdateAltrefWithoutDependency || temporal_reference == kTemporalUpdateGoldenWithoutDependency || + temporal_reference == kTemporalUpdateGoldenWithoutDependencyRefAltRef || + temporal_reference == kTemporalUpdateNoneNoRefGoldenRefAltRef || (temporal_reference == kTemporalUpdateNone && number_of_temporal_layers_ == 4)) { vp8_info->layerSync = true; diff --git a/src/modules/video_coding/codecs/vp8/temporal_layers.h b/src/modules/video_coding/codecs/vp8/temporal_layers.h index 2ca722917..6f738b51b 100644 --- a/src/modules/video_coding/codecs/vp8/temporal_layers.h +++ b/src/modules/video_coding/codecs/vp8/temporal_layers.h @@ -35,6 +35,18 @@ class TemporalLayers { private: enum TemporalReferences { + // First base layer frame for 3 temporal layers, which updates last and + // golden with alt ref dependency. + kTemporalUpdateLastAndGoldenRefAltRef = 11, + // First enhancement layer with alt ref dependency. + kTemporalUpdateGoldenRefAltRef = 10, + // First enhancement layer with alt ref dependency. + kTemporalUpdateGoldenWithoutDependencyRefAltRef = 9, + // Base layer with alt ref dependency. + kTemporalUpdateLastRefAltRef = 8, + // Highest enhacement layer without dependency on golden with alt ref + // dependency. + kTemporalUpdateNoneNoRefGoldenRefAltRef = 7, // Second layer and last frame in cycle, for 2 layers. kTemporalUpdateNoneNoRefAltref = 6, // Highest enhancement layer. diff --git a/src/modules/video_coding/codecs/vp8/temporal_layers_unittest.cc b/src/modules/video_coding/codecs/vp8/temporal_layers_unittest.cc index 6525ddaa8..2572fcd59 100644 --- a/src/modules/video_coding/codecs/vp8/temporal_layers_unittest.cc +++ b/src/modules/video_coding/codecs/vp8/temporal_layers_unittest.cc @@ -45,6 +45,21 @@ enum { VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY, + kTemporalUpdateNoneNoRefGolden = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY, + kTemporalUpdateGoldenWithoutDependencyRefAltRef = VP8_EFLAG_NO_REF_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST, + kTemporalUpdateGoldenRefAltRef = VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST, + kTemporalUpdateLastRefAltRef = VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF, + kTemporalUpdateLastAndGoldenRefAltRef = VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_REF_GF, }; TEST(TemporalLayersTest, 2Layers) { @@ -92,21 +107,21 @@ TEST(TemporalLayersTest, 3Layers) { CodecSpecificInfoVP8 vp8_info; tl.ConfigureBitrates(500, &cfg); - int expected_flags[16] = { kTemporalUpdateLast, - kTemporalUpdateAltrefWithoutDependency, - kTemporalUpdateGoldenWithoutDependency, - kTemporalUpdateAltref, - kTemporalUpdateLast, - kTemporalUpdateAltref, - kTemporalUpdateGolden, + int expected_flags[16] = { kTemporalUpdateLastAndGoldenRefAltRef, + kTemporalUpdateNoneNoRefGolden, + kTemporalUpdateGoldenWithoutDependencyRefAltRef, kTemporalUpdateNone, - kTemporalUpdateLast, - kTemporalUpdateAltrefWithoutDependency, - kTemporalUpdateGoldenWithoutDependency, - kTemporalUpdateAltref, - kTemporalUpdateLast, - kTemporalUpdateAltref, - kTemporalUpdateGolden, + kTemporalUpdateLastRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateGoldenRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateLastAndGoldenRefAltRef, + kTemporalUpdateNoneNoRefGolden, + kTemporalUpdateGoldenWithoutDependencyRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateLastRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateGoldenRefAltRef, kTemporalUpdateNone, }; int expected_temporal_idx[16] = @@ -171,13 +186,13 @@ TEST(TemporalLayersTest, KeyFrame) { tl.ConfigureBitrates(500, &cfg); int expected_flags[8] = { - kTemporalUpdateLast, - kTemporalUpdateAltrefWithoutDependency, - kTemporalUpdateGoldenWithoutDependency, - kTemporalUpdateAltref, - kTemporalUpdateLast, - kTemporalUpdateAltref, - kTemporalUpdateGolden, + kTemporalUpdateLastAndGoldenRefAltRef, + kTemporalUpdateNoneNoRefGolden, + kTemporalUpdateGoldenWithoutDependencyRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateLastRefAltRef, + kTemporalUpdateNone, + kTemporalUpdateGoldenRefAltRef, kTemporalUpdateNone, }; int expected_temporal_idx[8] =