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 979c64e24324bca7493001b16f37b94ed14b18d1..02c3f1541fc973d571dc4aa45c2386e5db54cd08 100644 |
--- a/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
+++ b/webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc |
@@ -96,16 +96,19 @@ std::vector<bool> GetTemporalLayerSync(size_t num_layers) { |
case 2: |
return {false, true, false, false, false, false, false, false}; |
case 3: |
- return {false, true, true, false, false, false, false, false}; |
+ if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) { |
+ return {false, true, true, false}; |
+ } else { |
+ 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}; |
+ return {false, true, true, false, true, false, false, false, |
+ false, false, false, false, false, false, false, false}; |
default: |
- RTC_NOTREACHED(); |
break; |
} |
- RTC_NOTREACHED(); |
- return {false}; |
+ RTC_NOTREACHED() << num_layers; |
+ return {}; |
} |
std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
@@ -134,7 +137,7 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
// TL0 also references and updates the 'last' buffer. |
// TL1 also references 'last' and references and updates 'golden'. |
return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
- TemporalLayers::kUpdate, |
+ TemporalLayers::kNone, |
TemporalLayers::kReference), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kUpdate, |
@@ -158,35 +161,68 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
TemporalLayers::kReference, TemporalLayers::kReference, |
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. |
- // TL0 also references and updates the 'last' buffer. |
- // TL1 also references 'last' and references and updates 'golden'. |
- // TL2 references both 'last' and 'golden' but updates no buffer. |
- return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
- TemporalLayers::kUpdate, |
- TemporalLayers::kReference), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kNone, |
- TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
- TemporalLayers::FrameConfig(TemporalLayers::kReference, |
- TemporalLayers::kUpdate, |
- TemporalLayers::kReference), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
- TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
- TemporalLayers::kNone, |
- TemporalLayers::kReference), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
- TemporalLayers::FrameConfig(TemporalLayers::kReference, |
- TemporalLayers::kReferenceAndUpdate, |
- TemporalLayers::kReference), |
- TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
+ if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) { |
+ // This field trial is intended to check if it is worth using a shorter |
+ // temporal pattern, trading some coding efficiency for less risk of |
+ // dropped frames. |
+ // The coding efficiency will decrease somewhat since the higher layer |
+ // state is more volatile, but it will be offset slightly by updating |
+ // the altref buffer with TL2 frames, instead of just referencing lower |
+ // layers. |
+ // If a frame is dropped in a higher layer, the jitter |
+ // buffer on the receive side won't be able to decode any higher layer |
+ // frame until the next sync frame. So we expect a noticeable decrease |
+ // in frame drops on links with high packet loss. |
+ |
+ // TL0 references and updates the 'last' buffer. |
+ // TL1 references 'last' and references and updates 'golden'. |
+ // TL2 references both 'last' & 'golden' and references and updates |
+ // 'arf'. |
+ return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
+ TemporalLayers::kNone, |
+ TemporalLayers::kNone), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kNone, |
+ TemporalLayers::kUpdate), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kUpdate, |
+ TemporalLayers::kNone), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kReference, |
+ TemporalLayers::kReference, |
+ TemporalLayers::kFreezeEntropy)}; |
+ } else { |
+ // All layers can reference but not update the 'alt' buffer, this means |
+ // that the 'alt' buffer reference is effectively the last keyframe. |
+ // TL0 also references and updates the 'last' buffer. |
+ // TL1 also references 'last' and references and updates 'golden'. |
+ // TL2 references both 'last' and 'golden' but updates no buffer. |
+ return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
+ TemporalLayers::kNone, |
+ TemporalLayers::kReference), |
+ TemporalLayers::FrameConfig( |
+ TemporalLayers::kReference, TemporalLayers::kNone, |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kUpdate, |
+ TemporalLayers::kReference), |
+ TemporalLayers::FrameConfig( |
+ TemporalLayers::kReference, TemporalLayers::kReference, |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
+ TemporalLayers::kNone, |
+ TemporalLayers::kReference), |
+ TemporalLayers::FrameConfig( |
+ TemporalLayers::kReference, TemporalLayers::kReference, |
+ TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kReferenceAndUpdate, |
+ TemporalLayers::kReference), |
+ TemporalLayers::FrameConfig(TemporalLayers::kReference, |
+ TemporalLayers::kReference, |
+ TemporalLayers::kReference, |
+ TemporalLayers::kFreezeEntropy)}; |
+ } |
case 4: |
// TL0 references and updates only the 'last' buffer. |
// TL1 references 'last' and updates and references 'golden'. |
@@ -196,13 +232,13 @@ std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
TemporalLayers::kNone, |
TemporalLayers::kNone), |
TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kReference, |
- TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
+ TemporalLayers::kReference, TemporalLayers::kNone, |
+ TemporalLayers::kNone, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kNone, |
TemporalLayers::kUpdate), |
TemporalLayers::FrameConfig( |
- TemporalLayers::kReference, TemporalLayers::kReference, |
+ TemporalLayers::kReference, TemporalLayers::kNone, |
TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
TemporalLayers::FrameConfig(TemporalLayers::kReference, |
TemporalLayers::kUpdate, |