Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: webrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc

Issue 3003823003: Fix FrameConfigs used for VP8 with four temporal layers. (Closed)
Patch Set: Fixed int to uint cast in test Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698