From 20cd06123c2884a141c038456c1dea089f697ecc Mon Sep 17 00:00:00 2001 From: "marpan@webrtc.org" Date: Thu, 19 Jan 2012 18:25:23 +0000 Subject: [PATCH] For TL(temporal layers) = 2, the alt-ref frame should not be used as a reference. Correction for the last frame in the cycle. Review URL: https://webrtc-codereview.appspot.com/343015 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1479 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../codecs/vp8/main/source/temporal_layers.cc | 5 ++++- .../codecs/vp8/main/source/temporal_layers.h | 2 ++ .../codecs/vp8/main/source/temporal_layers_unittest.cc | 9 +++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.cc b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.cc index 28c270d550..59ad9c2646 100644 --- a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.cc +++ b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.cc @@ -63,7 +63,7 @@ bool TemporalLayers::ConfigureBitrates(int bitrateKbit, temporal_pattern_[4] = kTemporalUpdateLast; temporal_pattern_[5] = kTemporalUpdateGolden; temporal_pattern_[6] = kTemporalUpdateLast; - temporal_pattern_[7] = kTemporalUpdateNone; + temporal_pattern_[7] = kTemporalUpdateNoneNoRefAltref; break; case 3: temporal_ids_length_ = 4; @@ -175,6 +175,9 @@ int TemporalLayers::EncodeFlags() { flags |= VP8_EFLAG_NO_UPD_GF; flags |= VP8_EFLAG_NO_UPD_LAST; break; + case kTemporalUpdateNoneNoRefAltref: + flags |= VP8_EFLAG_NO_REF_ARF; + // Deliberately no break here. case kTemporalUpdateNone: flags |= VP8_EFLAG_NO_UPD_GF; flags |= VP8_EFLAG_NO_UPD_ARF; diff --git a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.h b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.h index 6be0582a08..2ca7229170 100644 --- a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.h +++ b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers.h @@ -35,6 +35,8 @@ class TemporalLayers { private: enum TemporalReferences { + // Second layer and last frame in cycle, for 2 layers. + kTemporalUpdateNoneNoRefAltref = 6, // Highest enhancement layer. kTemporalUpdateNone = 5, // Second enhancement layer. diff --git a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers_unittest.cc b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers_unittest.cc index 69f35a5f64..7b35c6f5e3 100644 --- a/src/modules/video_coding/codecs/vp8/main/source/temporal_layers_unittest.cc +++ b/src/modules/video_coding/codecs/vp8/main/source/temporal_layers_unittest.cc @@ -40,6 +40,11 @@ enum { VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY, + kTemporalUpdateNoneNoRefAltRef = VP8_EFLAG_NO_REF_ARF | + VP8_EFLAG_NO_UPD_GF | + VP8_EFLAG_NO_UPD_ARF | + VP8_EFLAG_NO_UPD_LAST | + VP8_EFLAG_NO_UPD_ENTROPY, }; TEST(TemporalLayersTest, 2Layers) { @@ -55,7 +60,7 @@ TEST(TemporalLayersTest, 2Layers) { kTemporalUpdateLast, kTemporalUpdateGolden, kTemporalUpdateLast, - kTemporalUpdateNone, + kTemporalUpdateNoneNoRefAltRef, kTemporalUpdateLast, kTemporalUpdateGoldenWithoutDependency, kTemporalUpdateLast, @@ -63,7 +68,7 @@ TEST(TemporalLayersTest, 2Layers) { kTemporalUpdateLast, kTemporalUpdateGolden, kTemporalUpdateLast, - kTemporalUpdateNone + kTemporalUpdateNoneNoRefAltRef }; int expected_temporal_idx[16] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };