Index: webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc |
diff --git a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc |
index 6bfd03fb50b9abb8500301aa6beced6945231b5a..d535c617cd19ae1e028d4dddde655477ac61b1b4 100644 |
--- a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc |
+++ b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers.cc |
@@ -93,8 +93,10 @@ TemporalLayers::FrameConfig ScreenshareLayers::UpdateLayerConfig( |
if (number_of_temporal_layers_ <= 1) { |
// No flags needed for 1 layer screenshare. |
// TODO(pbos): Consider updating only last, and not all buffers. |
- return TemporalLayers::FrameConfig(kReferenceAndUpdate, kReferenceAndUpdate, |
- kReferenceAndUpdate); |
+ TemporalLayers::FrameConfig tl_config( |
+ kReferenceAndUpdate, kReferenceAndUpdate, kReferenceAndUpdate); |
+ tl_config.pattern_idx = static_cast<int>(kTl1); |
+ return tl_config; |
} |
const int64_t now_ms = clock_->TimeInMilliseconds(); |
@@ -108,8 +110,7 @@ TemporalLayers::FrameConfig ScreenshareLayers::UpdateLayerConfig( |
stats_.first_frame_time_ms_ = now_ms; |
int64_t unwrapped_timestamp = time_wrap_handler_.Unwrap(timestamp); |
- enum TemporalLayerState { kDrop, kTl0, kTl1, kTl1Sync }; |
- enum TemporalLayerState layer_state = kDrop; |
+ TemporalLayerState layer_state = kDrop; |
if (active_layer_ == -1 || |
layers_[active_layer_].state != TemporalLayer::State::kDropped) { |
if (last_emitted_tl0_timestamp_ != -1 && |
@@ -163,27 +164,33 @@ TemporalLayers::FrameConfig ScreenshareLayers::UpdateLayerConfig( |
layers_[0].UpdateDebt(ts_diff / 90); |
layers_[1].UpdateDebt(ts_diff / 90); |
last_timestamp_ = timestamp; |
+ TemporalLayers::FrameConfig tl_config; |
// TODO(pbos): Consider referencing but not updating the 'alt' buffer for all |
// layers. |
switch (layer_state) { |
case kDrop: |
- return TemporalLayers::FrameConfig(kNone, kNone, kNone); |
+ tl_config = TemporalLayers::FrameConfig(kNone, kNone, kNone); |
+ break; |
case kTl0: |
// TL0 only references and updates 'last'. |
- return TemporalLayers::FrameConfig(kReferenceAndUpdate, kNone, kNone); |
+ tl_config = |
+ TemporalLayers::FrameConfig(kReferenceAndUpdate, kNone, kNone); |
+ break; |
case kTl1: |
// TL1 references both 'last' and 'golden' but only updates 'golden'. |
- return TemporalLayers::FrameConfig(kReference, kReferenceAndUpdate, |
- kNone); |
+ tl_config = |
+ TemporalLayers::FrameConfig(kReference, kReferenceAndUpdate, kNone); |
+ break; |
case kTl1Sync: |
// Predict from only TL0 to allow participants to switch to the high |
// bitrate stream. Updates 'golden' so that TL1 can continue to refer to |
// and update 'golden' from this point on. |
- return TemporalLayers::FrameConfig(kReference, kUpdate, kNone, |
- kLayerSync); |
+ tl_config = TemporalLayers::FrameConfig(kReference, kUpdate, kNone); |
+ break; |
} |
- RTC_NOTREACHED(); |
- return TemporalLayers::FrameConfig(kNone, kNone, kNone); |
+ |
+ tl_config.pattern_idx = static_cast<int>(layer_state); |
+ return tl_config; |
} |
std::vector<uint32_t> ScreenshareLayers::OnRatesUpdated(int bitrate_kbps, |
@@ -265,10 +272,20 @@ void ScreenshareLayers::PopulateCodecSpecific( |
vp8_info->layerSync = false; |
vp8_info->tl0PicIdx = kNoTl0PicIdx; |
} else { |
- // TODO(pbos): Add active_layer_ to TemporalLayers::FrameConfig (as |
- // pattern_idx) and make function const. |
- RTC_DCHECK_NE(-1, active_layer_); |
- vp8_info->temporalIdx = active_layer_; |
+ TemporalLayerState layer_state = |
+ static_cast<TemporalLayerState>(tl_config.pattern_idx); |
+ switch (layer_state) { |
+ case kDrop: |
+ RTC_NOTREACHED(); |
+ break; |
+ case kTl0: |
+ vp8_info->temporalIdx = 0; |
+ break; |
+ case kTl1: |
+ case kTl1Sync: |
+ vp8_info->temporalIdx = 1; |
+ break; |
+ } |
if (frame_is_keyframe) { |
vp8_info->temporalIdx = 0; |
last_sync_timestamp_ = unwrapped_timestamp; |