OLD | NEW |
1 /* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 1 /* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
2 * | 2 * |
3 * Use of this source code is governed by a BSD-style license | 3 * Use of this source code is governed by a BSD-style license |
4 * that can be found in the LICENSE file in the root of the source | 4 * that can be found in the LICENSE file in the root of the source |
5 * tree. An additional intellectual property rights grant can be found | 5 * tree. An additional intellectual property rights grant can be found |
6 * in the file PATENTS. All contributing project authors may | 6 * in the file PATENTS. All contributing project authors may |
7 * be found in the AUTHORS file in the root of the source tree. | 7 * be found in the AUTHORS file in the root of the source tree. |
8 */ | 8 */ |
9 | 9 |
10 #include "webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.h" | 10 #include "webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 return {0}; | 89 return {0}; |
90 } | 90 } |
91 | 91 |
92 std::vector<bool> GetTemporalLayerSync(size_t num_layers) { | 92 std::vector<bool> GetTemporalLayerSync(size_t num_layers) { |
93 switch (num_layers) { | 93 switch (num_layers) { |
94 case 1: | 94 case 1: |
95 return {false}; | 95 return {false}; |
96 case 2: | 96 case 2: |
97 return {false, true, false, false, false, false, false, false}; | 97 return {false, true, false, false, false, false, false, false}; |
98 case 3: | 98 case 3: |
99 return {false, true, true, false, false, false, false, false}; | 99 if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) { |
| 100 return {false, true, true, false}; |
| 101 } else { |
| 102 return {false, true, true, false, false, false, false, false}; |
| 103 } |
100 case 4: | 104 case 4: |
101 return {false, true, true, true, true, true, false, true, | 105 return {false, true, true, false, true, false, false, false, |
102 false, true, false, true, false, true, false, true}; | 106 false, false, false, false, false, false, false, false}; |
103 default: | 107 default: |
104 RTC_NOTREACHED(); | |
105 break; | 108 break; |
106 } | 109 } |
107 RTC_NOTREACHED(); | 110 RTC_NOTREACHED() << num_layers; |
108 return {false}; | 111 return {}; |
109 } | 112 } |
110 | 113 |
111 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { | 114 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
112 // For indexing in the patterns described below (which temporal layers they | 115 // For indexing in the patterns described below (which temporal layers they |
113 // belong to), see the diagram above. | 116 // belong to), see the diagram above. |
114 // Layer sync is done similarly for all patterns (except single stream) and | 117 // Layer sync is done similarly for all patterns (except single stream) and |
115 // happens every 8 frames: | 118 // happens every 8 frames: |
116 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still | 119 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still |
117 // updating 'golden', so it can be used as a reference by future TL1 frames. | 120 // updating 'golden', so it can be used as a reference by future TL1 frames. |
118 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending | 121 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending |
119 // on TL1's buffer before TL1 has layer synced). | 122 // on TL1's buffer before TL1 has layer synced). |
120 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for | 123 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for |
121 // the base layer in 1-3TL instead of 'last' periodically on long intervals, | 124 // the base layer in 1-3TL instead of 'last' periodically on long intervals, |
122 // so that if scene changes occur (user walks between rooms or rotates webcam) | 125 // so that if scene changes occur (user walks between rooms or rotates webcam) |
123 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant | 126 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant |
124 // keyframe. | 127 // keyframe. |
125 switch (num_layers) { | 128 switch (num_layers) { |
126 case 1: | 129 case 1: |
127 // All frames reference all buffers and the 'last' buffer is updated. | 130 // All frames reference all buffers and the 'last' buffer is updated. |
128 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 131 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
129 TemporalLayers::kReference, | 132 TemporalLayers::kReference, |
130 TemporalLayers::kReference)}; | 133 TemporalLayers::kReference)}; |
131 case 2: | 134 case 2: |
132 // All layers can reference but not update the 'alt' buffer, this means | 135 // All layers can reference but not update the 'alt' buffer, this means |
133 // that the 'alt' buffer reference is effectively the last keyframe. | 136 // that the 'alt' buffer reference is effectively the last keyframe. |
134 // TL0 also references and updates the 'last' buffer. | 137 // TL0 also references and updates the 'last' buffer. |
135 // TL1 also references 'last' and references and updates 'golden'. | 138 // TL1 also references 'last' and references and updates 'golden'. |
136 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 139 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
137 TemporalLayers::kUpdate, | 140 TemporalLayers::kNone, |
138 TemporalLayers::kReference), | 141 TemporalLayers::kReference), |
139 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 142 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
140 TemporalLayers::kUpdate, | 143 TemporalLayers::kUpdate, |
141 TemporalLayers::kReference), | 144 TemporalLayers::kReference), |
142 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 145 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
143 TemporalLayers::kNone, | 146 TemporalLayers::kNone, |
144 TemporalLayers::kReference), | 147 TemporalLayers::kReference), |
145 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 148 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
146 TemporalLayers::kReferenceAndUpdate, | 149 TemporalLayers::kReferenceAndUpdate, |
147 TemporalLayers::kReference), | 150 TemporalLayers::kReference), |
148 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 151 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
149 TemporalLayers::kNone, | 152 TemporalLayers::kNone, |
150 TemporalLayers::kReference), | 153 TemporalLayers::kReference), |
151 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 154 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
152 TemporalLayers::kReferenceAndUpdate, | 155 TemporalLayers::kReferenceAndUpdate, |
153 TemporalLayers::kReference), | 156 TemporalLayers::kReference), |
154 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 157 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
155 TemporalLayers::kNone, | 158 TemporalLayers::kNone, |
156 TemporalLayers::kReference), | 159 TemporalLayers::kReference), |
157 TemporalLayers::FrameConfig( | 160 TemporalLayers::FrameConfig( |
158 TemporalLayers::kReference, TemporalLayers::kReference, | 161 TemporalLayers::kReference, TemporalLayers::kReference, |
159 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; | 162 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
160 case 3: | 163 case 3: |
161 // All layers can reference but not update the 'alt' buffer, this means | 164 if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) { |
162 // that the 'alt' buffer reference is effectively the last keyframe. | 165 // This field trial is intended to check if it is worth using a shorter |
163 // TL0 also references and updates the 'last' buffer. | 166 // temporal pattern, trading some coding efficiency for less risk of |
164 // TL1 also references 'last' and references and updates 'golden'. | 167 // dropped frames. |
165 // TL2 references both 'last' and 'golden' but updates no buffer. | 168 // The coding efficiency will decrease somewhat since the higher layer |
166 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 169 // state is more volatile, but it will be offset slightly by updating |
167 TemporalLayers::kUpdate, | 170 // the altref buffer with TL2 frames, instead of just referencing lower |
168 TemporalLayers::kReference), | 171 // layers. |
169 TemporalLayers::FrameConfig( | 172 // If a frame is dropped in a higher layer, the jitter |
170 TemporalLayers::kReference, TemporalLayers::kNone, | 173 // buffer on the receive side won't be able to decode any higher layer |
171 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 174 // frame until the next sync frame. So we expect a noticeable decrease |
172 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 175 // in frame drops on links with high packet loss. |
173 TemporalLayers::kUpdate, | 176 |
174 TemporalLayers::kReference), | 177 // TL0 references and updates the 'last' buffer. |
175 TemporalLayers::FrameConfig( | 178 // TL1 references 'last' and references and updates 'golden'. |
176 TemporalLayers::kReference, TemporalLayers::kReference, | 179 // TL2 references both 'last' & 'golden' and references and updates |
177 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 180 // 'arf'. |
178 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 181 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
179 TemporalLayers::kNone, | 182 TemporalLayers::kNone, |
180 TemporalLayers::kReference), | 183 TemporalLayers::kNone), |
181 TemporalLayers::FrameConfig( | 184 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
182 TemporalLayers::kReference, TemporalLayers::kReference, | 185 TemporalLayers::kNone, |
183 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 186 TemporalLayers::kUpdate), |
184 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 187 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
185 TemporalLayers::kReferenceAndUpdate, | 188 TemporalLayers::kUpdate, |
186 TemporalLayers::kReference), | 189 TemporalLayers::kNone), |
187 TemporalLayers::FrameConfig( | 190 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
188 TemporalLayers::kReference, TemporalLayers::kReference, | 191 TemporalLayers::kReference, |
189 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; | 192 TemporalLayers::kReference, |
| 193 TemporalLayers::kFreezeEntropy)}; |
| 194 } else { |
| 195 // All layers can reference but not update the 'alt' buffer, this means |
| 196 // that the 'alt' buffer reference is effectively the last keyframe. |
| 197 // TL0 also references and updates the 'last' buffer. |
| 198 // TL1 also references 'last' and references and updates 'golden'. |
| 199 // TL2 references both 'last' and 'golden' but updates no buffer. |
| 200 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
| 201 TemporalLayers::kNone, |
| 202 TemporalLayers::kReference), |
| 203 TemporalLayers::FrameConfig( |
| 204 TemporalLayers::kReference, TemporalLayers::kNone, |
| 205 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
| 206 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
| 207 TemporalLayers::kUpdate, |
| 208 TemporalLayers::kReference), |
| 209 TemporalLayers::FrameConfig( |
| 210 TemporalLayers::kReference, TemporalLayers::kReference, |
| 211 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
| 212 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
| 213 TemporalLayers::kNone, |
| 214 TemporalLayers::kReference), |
| 215 TemporalLayers::FrameConfig( |
| 216 TemporalLayers::kReference, TemporalLayers::kReference, |
| 217 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
| 218 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
| 219 TemporalLayers::kReferenceAndUpdate, |
| 220 TemporalLayers::kReference), |
| 221 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
| 222 TemporalLayers::kReference, |
| 223 TemporalLayers::kReference, |
| 224 TemporalLayers::kFreezeEntropy)}; |
| 225 } |
190 case 4: | 226 case 4: |
191 // TL0 references and updates only the 'last' buffer. | 227 // TL0 references and updates only the 'last' buffer. |
192 // TL1 references 'last' and updates and references 'golden'. | 228 // TL1 references 'last' and updates and references 'golden'. |
193 // TL2 references 'last' and 'golden', and references and updates 'arf'. | 229 // TL2 references 'last' and 'golden', and references and updates 'arf'. |
194 // TL3 references all buffers but update none of them. | 230 // TL3 references all buffers but update none of them. |
195 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 231 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
196 TemporalLayers::kNone, | 232 TemporalLayers::kNone, |
197 TemporalLayers::kNone), | 233 TemporalLayers::kNone), |
198 TemporalLayers::FrameConfig( | 234 TemporalLayers::FrameConfig( |
199 TemporalLayers::kReference, TemporalLayers::kReference, | 235 TemporalLayers::kReference, TemporalLayers::kNone, |
200 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 236 TemporalLayers::kNone, TemporalLayers::kFreezeEntropy), |
201 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 237 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
202 TemporalLayers::kNone, | 238 TemporalLayers::kNone, |
203 TemporalLayers::kUpdate), | 239 TemporalLayers::kUpdate), |
204 TemporalLayers::FrameConfig( | 240 TemporalLayers::FrameConfig( |
205 TemporalLayers::kReference, TemporalLayers::kReference, | 241 TemporalLayers::kReference, TemporalLayers::kNone, |
206 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 242 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
207 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 243 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
208 TemporalLayers::kUpdate, | 244 TemporalLayers::kUpdate, |
209 TemporalLayers::kNone), | 245 TemporalLayers::kNone), |
210 TemporalLayers::FrameConfig( | 246 TemporalLayers::FrameConfig( |
211 TemporalLayers::kReference, TemporalLayers::kReference, | 247 TemporalLayers::kReference, TemporalLayers::kReference, |
212 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 248 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
213 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 249 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
214 TemporalLayers::kReference, | 250 TemporalLayers::kReference, |
215 TemporalLayers::kReferenceAndUpdate), | 251 TemporalLayers::kReferenceAndUpdate), |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers)) | 422 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers)) |
387 listener_->OnTemporalLayersCreated(simulcast_id, tl); | 423 listener_->OnTemporalLayersCreated(simulcast_id, tl); |
388 return tl; | 424 return tl; |
389 } | 425 } |
390 | 426 |
391 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { | 427 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { |
392 listener_ = listener; | 428 listener_ = listener; |
393 } | 429 } |
394 | 430 |
395 } // namespace webrtc | 431 } // namespace webrtc |
OLD | NEW |