From 9fe3d51372c95a353ff32970cccaba6fe67135ea Mon Sep 17 00:00:00 2001 From: "pwestin@webrtc.org" Date: Wed, 14 Dec 2011 15:13:04 +0000 Subject: [PATCH] Set the new layer sync bit in the VP8 info struct. Review URL: http://webrtc-codereview.appspot.com/324010 git-svn-id: http://webrtc.googlecode.com/svn/trunk@1185 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../codecs/vp8/main/source/temporal_layers.cc | 12 +++++++++++ .../main/source/temporal_layers_unittest.cc | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+) 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 b5d59f8001..2f6b5f9b43 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 @@ -194,6 +194,18 @@ void TemporalLayers::PopulateCodecSpecific(bool key_frame, } else { vp8_info->temporalIdx = temporal_ids_[pattern_idx_ % temporal_ids_length_]; } + TemporalReferences temporal_reference = + temporal_pattern_[pattern_idx_ % temporal_pattern_length_]; + + if (temporal_reference == kTemporalUpdateAltrefWithoutDependency || + temporal_reference == kTemporalUpdateGoldenWithoutDependency || + (temporal_reference == kTemporalUpdateNone && + number_of_temporal_layers_ == 4)) { + vp8_info->layerSync = true; + } else { + vp8_info->layerSync = false; + } + if (vp8_info->temporalIdx == 0) { tl0_pic_idx_++; } 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 45d9ede488..51f33c33ef 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 @@ -67,10 +67,15 @@ TEST(TemporalLayersTest, 2Layers) { int expected_temporal_idx[16] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }; + bool expected_layer_sync[16] = + { false, true, false, false, false, false, false, false, + false, true, false, false, false, false, false, false }; + for (int i = 0; i < 16; ++i) { EXPECT_EQ(expected_flags[i], tl.EncodeFlags()); tl.PopulateCodecSpecific(false, &vp8_info); EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); + EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); } } @@ -100,10 +105,15 @@ TEST(TemporalLayersTest, 3Layers) { int expected_temporal_idx[16] = { 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 1, 2 }; + bool expected_layer_sync[16] = + { false, true, true, false, false, false, false, false, + false, true, true, false, false, false, false, false }; + for (int i = 0; i < 16; ++i) { EXPECT_EQ(expected_flags[i], tl.EncodeFlags()); tl.PopulateCodecSpecific(false, &vp8_info); EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); + EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); } } @@ -133,10 +143,15 @@ TEST(TemporalLayersTest, 4Layers) { int expected_temporal_idx[16] = { 0, 3, 2, 3, 1, 3, 2, 3, 0, 3, 2, 3, 1, 3, 2, 3 }; + bool expected_layer_sync[16] = + { false, true, true, true, true, true, false, true, + false, true, false, true, false, true, false, true }; + for (int i = 0; i < 16; ++i) { EXPECT_EQ(expected_flags[i], tl.EncodeFlags()); tl.PopulateCodecSpecific(false, &vp8_info); EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); + EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); } } @@ -159,13 +174,18 @@ TEST(TemporalLayersTest, KeyFrame) { int expected_temporal_idx[8] = { 0, 0, 0, 0, 0, 0, 0, 2}; + bool expected_layer_sync[8] = + { false, true, true, false, false, false, false, false }; + for (int i = 0; i < 7; ++i) { EXPECT_EQ(expected_flags[i], tl.EncodeFlags()); tl.PopulateCodecSpecific(true, &vp8_info); EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx); + EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync); } EXPECT_EQ(expected_flags[7], tl.EncodeFlags()); tl.PopulateCodecSpecific(false, &vp8_info); EXPECT_EQ(expected_temporal_idx[7], vp8_info.temporalIdx); + EXPECT_EQ(expected_layer_sync[7], vp8_info.layerSync); } } // namespace webrtc