Index: webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
diff --git a/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
index b8359ade391f158b3e8c61465230aacc027a33f2..3573aa8f1cb55a1e8f65f7f3d9741a6d8a239926 100644 |
--- a/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
+++ b/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
@@ -30,22 +30,17 @@ TemporalLayers::FrameConfig::FrameConfig() {} |
TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, |
TemporalLayers::BufferFlags golden, |
TemporalLayers::BufferFlags arf) |
- : FrameConfig(last, golden, arf, false, false) {} |
+ : FrameConfig(last, golden, arf, false) {} |
TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, |
TemporalLayers::BufferFlags golden, |
TemporalLayers::BufferFlags arf, |
- int extra_flags) |
- : FrameConfig(last, |
- golden, |
- arf, |
- (extra_flags & kLayerSync) != 0, |
- (extra_flags & kFreezeEntropy) != 0) {} |
+ FreezeEntropy) |
+ : FrameConfig(last, golden, arf, true) {} |
TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, |
TemporalLayers::BufferFlags golden, |
TemporalLayers::BufferFlags arf, |
- bool layer_sync, |
bool freeze_entropy) |
: drop_frame(last == TemporalLayers::kNone && |
golden == TemporalLayers::kNone && |
@@ -53,7 +48,6 @@ TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, |
last_buffer_flags(last), |
golden_buffer_flags(golden), |
arf_buffer_flags(arf), |
- layer_sync(layer_sync), |
freeze_entropy(freeze_entropy) {} |
namespace { |
@@ -90,6 +84,25 @@ std::vector<unsigned int> GetTemporalIds(size_t num_layers) { |
return {0}; |
} |
+std::vector<bool> GetTemporalLayerSync(size_t num_layers) { |
+ switch (num_layers) { |
+ case 1: |
+ return {false}; |
+ case 2: |
+ return {false, true, false, false, false, false, false, false}; |
+ case 3: |
+ return {false, true, true, false, false, false, false, false}; |
+ case 4: |
+ return {false, true, true, true, true, true, false, true, |
+ false, true, false, true, false, true, false, true}; |
+ default: |
+ RTC_NOTREACHED(); |
+ break; |
+ } |
+ RTC_NOTREACHED(); |
+ return {false}; |
+} |
+ |
std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
// For indexing in the patterns described below (which temporal layers they |
// belong to), see the diagram above. |
@@ -118,9 +131,9 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kUpdate, |
TemporalLayers::kReference), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kUpdate, |
- TemporalLayers::kReference, kLayerSync), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kUpdate, |
+ TemporalLayers::kReference), |
TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kNone, |
TemporalLayers::kReference), |
@@ -138,7 +151,7 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
TemporalLayers::kReference), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kFreezeEntropy)}; |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
case 3: |
// All layers can reference but not update the 'alt' buffer, this means |
// that the 'alt' buffer reference is effectively the last keyframe. |
@@ -150,25 +163,25 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
TemporalLayers::kReference), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kNone, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kUpdate, |
- TemporalLayers::kReference, kLayerSync), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kUpdate, |
+ TemporalLayers::kReference), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kNone, |
TemporalLayers::kReference), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kReference), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kFreezeEntropy)}; |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
case 4: |
// TL0 references and updates only the 'last' buffer. |
// TL1 references 'last' and updates and references 'golden'. |
@@ -179,49 +192,49 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
TemporalLayers::kNone), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kNone, |
- TemporalLayers::kUpdate, kLayerSync), |
+ TemporalLayers::kUpdate), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kUpdate, |
- TemporalLayers::kNone, kLayerSync), |
+ TemporalLayers::kNone), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kReference, |
TemporalLayers::kReferenceAndUpdate), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kNone, |
TemporalLayers::kNone), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kReference, |
TemporalLayers::kReferenceAndUpdate), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kReferenceAndUpdate, |
TemporalLayers::kNone), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kReference, |
TemporalLayers::kReferenceAndUpdate), |
TemporalLayers::FrameConfig( |
TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, kLayerSync | kFreezeEntropy)}; |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
default: |
RTC_NOTREACHED(); |
break; |
@@ -237,11 +250,13 @@ DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers, |
uint8_t initial_tl0_pic_idx) |
: num_layers_(std::max(1, number_of_temporal_layers)), |
temporal_ids_(GetTemporalIds(num_layers_)), |
+ temporal_layer_sync_(GetTemporalLayerSync(num_layers_)), |
temporal_pattern_(GetTemporalPattern(num_layers_)), |
tl0_pic_idx_(initial_tl0_pic_idx), |
pattern_idx_(255), |
timestamp_(0), |
last_base_layer_sync_(false) { |
+ RTC_DCHECK_EQ(temporal_pattern_.size(), temporal_layer_sync_.size()); |
RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers); |
RTC_CHECK_GE(number_of_temporal_layers, 0); |
RTC_CHECK_LE(number_of_temporal_layers, 4); |
@@ -339,7 +354,8 @@ void DefaultTemporalLayers::PopulateCodecSpecific( |
} else { |
vp8_info->temporalIdx = GetTemporalLayerId(tl_config); |
- vp8_info->layerSync = tl_config.layer_sync; |
+ vp8_info->layerSync = temporal_layer_sync_[tl_config.pattern_idx % |
+ temporal_layer_sync_.size()]; |
} |
if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) { |
// Regardless of pattern the frame after a base layer sync will always |