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

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: Fix unit tests, add full stack tests 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 RTC_NOTREACHED(); 88 RTC_NOTREACHED();
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 std::vector<bool> sync_pattern = {false, true, true, false,
100 false, false, false, false};
101 if (field_trial::IsEnabled("WebRTC-AltTemporalLayers"))
pbos1 2017/08/31 19:54:38 Actually if this is not supposed to be a subset be
pbos1 2017/08/31 19:54:38 Also do you think we could generate GetTemporalLay
sprang_webrtc 2017/09/01 14:32:56 Potentially, but it's not super straight forward.
sprang_webrtc 2017/09/01 14:32:56 Done.
102 sync_pattern.resize(4);
103 return sync_pattern;
104 }
100 case 4: 105 case 4:
101 return {false, true, true, true, true, true, false, true, 106 return {false, true, true, false, true, false, false, false,
102 false, true, false, true, false, true, false, true}; 107 false, false, false, false, false, false, false, false};
103 default: 108 default:
104 RTC_NOTREACHED();
105 break; 109 break;
106 } 110 }
107 RTC_NOTREACHED(); 111 RTC_NOTREACHED() << num_layers;
108 return {false}; 112 return {};
109 } 113 }
110 114
111 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { 115 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) {
112 // For indexing in the patterns described below (which temporal layers they 116 // For indexing in the patterns described below (which temporal layers they
113 // belong to), see the diagram above. 117 // belong to), see the diagram above.
114 // Layer sync is done similarly for all patterns (except single stream) and 118 // Layer sync is done similarly for all patterns (except single stream) and
115 // happens every 8 frames: 119 // happens every 8 frames:
116 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still 120 // 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. 121 // 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 122 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending
119 // on TL1's buffer before TL1 has layer synced). 123 // on TL1's buffer before TL1 has layer synced).
120 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for 124 // 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, 125 // 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) 126 // 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 127 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant
124 // keyframe. 128 // keyframe.
125 switch (num_layers) { 129 switch (num_layers) {
126 case 1: 130 case 1:
127 // All frames reference all buffers and the 'last' buffer is updated. 131 // All frames reference all buffers and the 'last' buffer is updated.
128 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 132 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
129 TemporalLayers::kReference, 133 TemporalLayers::kReference,
130 TemporalLayers::kReference)}; 134 TemporalLayers::kReference)};
131 case 2: 135 case 2:
132 // All layers can reference but not update the 'alt' buffer, this means 136 // All layers can reference but not update the 'alt' buffer, this means
133 // that the 'alt' buffer reference is effectively the last keyframe. 137 // that the 'alt' buffer reference is effectively the last keyframe.
134 // TL0 also references and updates the 'last' buffer. 138 // TL0 also references and updates the 'last' buffer.
135 // TL1 also references 'last' and references and updates 'golden'. 139 // TL1 also references 'last' and references and updates 'golden'.
136 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 140 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
137 TemporalLayers::kUpdate, 141 TemporalLayers::kNone,
138 TemporalLayers::kReference), 142 TemporalLayers::kReference),
139 TemporalLayers::FrameConfig(TemporalLayers::kReference, 143 TemporalLayers::FrameConfig(TemporalLayers::kReference,
140 TemporalLayers::kUpdate, 144 TemporalLayers::kUpdate,
141 TemporalLayers::kReference), 145 TemporalLayers::kReference),
142 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 146 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
143 TemporalLayers::kNone, 147 TemporalLayers::kNone,
144 TemporalLayers::kReference), 148 TemporalLayers::kReference),
145 TemporalLayers::FrameConfig(TemporalLayers::kReference, 149 TemporalLayers::FrameConfig(TemporalLayers::kReference,
146 TemporalLayers::kReferenceAndUpdate, 150 TemporalLayers::kReferenceAndUpdate,
147 TemporalLayers::kReference), 151 TemporalLayers::kReference),
148 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 152 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
149 TemporalLayers::kNone, 153 TemporalLayers::kNone,
150 TemporalLayers::kReference), 154 TemporalLayers::kReference),
151 TemporalLayers::FrameConfig(TemporalLayers::kReference, 155 TemporalLayers::FrameConfig(TemporalLayers::kReference,
152 TemporalLayers::kReferenceAndUpdate, 156 TemporalLayers::kReferenceAndUpdate,
153 TemporalLayers::kReference), 157 TemporalLayers::kReference),
154 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 158 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
155 TemporalLayers::kNone, 159 TemporalLayers::kNone,
156 TemporalLayers::kReference), 160 TemporalLayers::kReference),
157 TemporalLayers::FrameConfig( 161 TemporalLayers::FrameConfig(
158 TemporalLayers::kReference, TemporalLayers::kReference, 162 TemporalLayers::kReference, TemporalLayers::kReference,
159 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; 163 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
160 case 3: 164 case 3:
161 // All layers can reference but not update the 'alt' buffer, this means 165 if (field_trial::IsEnabled("WebRTC-AltTemporalLayers")) {
pbos1 2017/08/31 19:54:38 Can you put down here why this is meaningfully dif
sprang_webrtc 2017/09/01 14:32:56 Done.
162 // that the 'alt' buffer reference is effectively the last keyframe. 166 // TL0 references and updates the 'last' buffer.
163 // TL0 also references and updates the 'last' buffer. 167 // TL1 references 'last' and references and updates 'golden'.
164 // TL1 also references 'last' and references and updates 'golden'. 168 // TL2 references both 'last' & 'golden' and references and updates
165 // TL2 references both 'last' and 'golden' but updates no buffer. 169 // 'arf'.
166 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 170 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
167 TemporalLayers::kUpdate, 171 TemporalLayers::kNone,
168 TemporalLayers::kReference), 172 TemporalLayers::kNone),
169 TemporalLayers::FrameConfig( 173 TemporalLayers::FrameConfig(TemporalLayers::kReference,
170 TemporalLayers::kReference, TemporalLayers::kNone, 174 TemporalLayers::kNone,
171 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 175 TemporalLayers::kUpdate),
172 TemporalLayers::FrameConfig(TemporalLayers::kReference, 176 TemporalLayers::FrameConfig(TemporalLayers::kReference,
173 TemporalLayers::kUpdate, 177 TemporalLayers::kUpdate,
174 TemporalLayers::kReference), 178 TemporalLayers::kNone),
175 TemporalLayers::FrameConfig( 179 TemporalLayers::FrameConfig(TemporalLayers::kReference,
176 TemporalLayers::kReference, TemporalLayers::kReference, 180 TemporalLayers::kReference,
177 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 181 TemporalLayers::kReference,
178 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 182 TemporalLayers::kFreezeEntropy)};
179 TemporalLayers::kNone, 183 } else {
180 TemporalLayers::kReference), 184 // All layers can reference but not update the 'alt' buffer, this means
181 TemporalLayers::FrameConfig( 185 // that the 'alt' buffer reference is effectively the last keyframe.
182 TemporalLayers::kReference, TemporalLayers::kReference, 186 // TL0 also references and updates the 'last' buffer.
183 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 187 // TL1 also references 'last' and references and updates 'golden'.
184 TemporalLayers::FrameConfig(TemporalLayers::kReference, 188 // TL2 references both 'last' and 'golden' but updates no buffer.
185 TemporalLayers::kReferenceAndUpdate, 189 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
186 TemporalLayers::kReference), 190 TemporalLayers::kNone,
187 TemporalLayers::FrameConfig( 191 TemporalLayers::kReference),
188 TemporalLayers::kReference, TemporalLayers::kReference, 192 TemporalLayers::FrameConfig(
189 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; 193 TemporalLayers::kReference, TemporalLayers::kNone,
194 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
195 TemporalLayers::FrameConfig(TemporalLayers::kReference,
196 TemporalLayers::kUpdate,
197 TemporalLayers::kReference),
198 TemporalLayers::FrameConfig(
199 TemporalLayers::kReference, TemporalLayers::kReference,
200 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
201 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
202 TemporalLayers::kNone,
203 TemporalLayers::kReference),
204 TemporalLayers::FrameConfig(
205 TemporalLayers::kReference, TemporalLayers::kReference,
206 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
207 TemporalLayers::FrameConfig(TemporalLayers::kReference,
208 TemporalLayers::kReferenceAndUpdate,
209 TemporalLayers::kReference),
210 TemporalLayers::FrameConfig(TemporalLayers::kReference,
211 TemporalLayers::kReference,
212 TemporalLayers::kReference,
213 TemporalLayers::kFreezeEntropy)};
214 }
190 case 4: 215 case 4:
191 // TL0 references and updates only the 'last' buffer. 216 // TL0 references and updates only the 'last' buffer.
192 // TL1 references 'last' and updates and references 'golden'. 217 // TL1 references 'last' and updates and references 'golden'.
193 // TL2 references 'last' and 'golden', and references and updates 'arf'. 218 // TL2 references 'last' and 'golden', and references and updates 'arf'.
194 // TL3 references all buffers but update none of them. 219 // TL3 references all buffers but update none of them.
195 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 220 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
196 TemporalLayers::kNone, 221 TemporalLayers::kNone,
197 TemporalLayers::kNone), 222 TemporalLayers::kNone),
198 TemporalLayers::FrameConfig( 223 TemporalLayers::FrameConfig(
199 TemporalLayers::kReference, TemporalLayers::kReference, 224 TemporalLayers::kReference, TemporalLayers::kNone,
200 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 225 TemporalLayers::kNone, TemporalLayers::kFreezeEntropy),
201 TemporalLayers::FrameConfig(TemporalLayers::kReference, 226 TemporalLayers::FrameConfig(TemporalLayers::kReference,
202 TemporalLayers::kNone, 227 TemporalLayers::kNone,
203 TemporalLayers::kUpdate), 228 TemporalLayers::kUpdate),
204 TemporalLayers::FrameConfig( 229 TemporalLayers::FrameConfig(
205 TemporalLayers::kReference, TemporalLayers::kReference, 230 TemporalLayers::kReference, TemporalLayers::kNone,
206 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 231 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
207 TemporalLayers::FrameConfig(TemporalLayers::kReference, 232 TemporalLayers::FrameConfig(TemporalLayers::kReference,
208 TemporalLayers::kUpdate, 233 TemporalLayers::kUpdate,
209 TemporalLayers::kNone), 234 TemporalLayers::kNone),
210 TemporalLayers::FrameConfig( 235 TemporalLayers::FrameConfig(
211 TemporalLayers::kReference, TemporalLayers::kReference, 236 TemporalLayers::kReference, TemporalLayers::kReference,
212 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), 237 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
213 TemporalLayers::FrameConfig(TemporalLayers::kReference, 238 TemporalLayers::FrameConfig(TemporalLayers::kReference,
214 TemporalLayers::kReference, 239 TemporalLayers::kReference,
215 TemporalLayers::kReferenceAndUpdate), 240 TemporalLayers::kReferenceAndUpdate),
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers)) 411 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers))
387 listener_->OnTemporalLayersCreated(simulcast_id, tl); 412 listener_->OnTemporalLayersCreated(simulcast_id, tl);
388 return tl; 413 return tl;
389 } 414 }
390 415
391 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { 416 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) {
392 listener_ = listener; 417 listener_ = listener;
393 } 418 }
394 419
395 } // namespace webrtc 420 } // 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