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

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

Issue 2853073004: Derive current layer from TL frame config. (Closed)
Patch Set: rebase Created 3 years, 7 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
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"
11 11
12 #include <stdlib.h> 12 #include <stdlib.h>
13 #include <string.h> 13 #include <string.h>
14 14
15 #include <algorithm> 15 #include <algorithm>
16 #include <vector> 16 #include <vector>
17 17
18 #include "webrtc/base/checks.h" 18 #include "webrtc/base/checks.h"
19 #include "webrtc/modules/include/module_common_types.h" 19 #include "webrtc/modules/include/module_common_types.h"
20 #include "webrtc/modules/video_coding/include/video_codec_interface.h" 20 #include "webrtc/modules/video_coding/include/video_codec_interface.h"
21 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" 21 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
22 22
23 #include "vpx/vpx_encoder.h" 23 #include "vpx/vpx_encoder.h"
24 #include "vpx/vp8cx.h" 24 #include "vpx/vp8cx.h"
25 25
26 namespace webrtc { 26 namespace webrtc {
27 27
28 TemporalReferences::TemporalReferences(TemporalBufferFlags last, 28 TemporalLayers::FrameConfig::FrameConfig() {}
29 TemporalBufferFlags golden,
30 TemporalBufferFlags arf)
31 : TemporalReferences(last, golden, arf, false, false) {}
32 29
33 TemporalReferences::TemporalReferences(TemporalBufferFlags last, 30 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
34 TemporalBufferFlags golden, 31 TemporalLayers::BufferFlags golden,
35 TemporalBufferFlags arf, 32 TemporalLayers::BufferFlags arf)
36 int extra_flags) 33 : FrameConfig(last, golden, arf, false, false) {}
37 : TemporalReferences(last,
38 golden,
39 arf,
40 (extra_flags & kLayerSync) != 0,
41 (extra_flags & kFreezeEntropy) != 0) {}
42 34
43 TemporalReferences::TemporalReferences(TemporalBufferFlags last, 35 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
44 TemporalBufferFlags golden, 36 TemporalLayers::BufferFlags golden,
45 TemporalBufferFlags arf, 37 TemporalLayers::BufferFlags arf,
46 bool layer_sync, 38 int extra_flags)
47 bool freeze_entropy) 39 : FrameConfig(last,
48 : drop_frame(last == kNone && golden == kNone && arf == kNone), 40 golden,
41 arf,
42 (extra_flags & kLayerSync) != 0,
43 (extra_flags & kFreezeEntropy) != 0) {}
44
45 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
46 TemporalLayers::BufferFlags golden,
47 TemporalLayers::BufferFlags arf,
48 bool layer_sync,
49 bool freeze_entropy)
50 : drop_frame(last == TemporalLayers::kNone &&
51 golden == TemporalLayers::kNone &&
52 arf == TemporalLayers::kNone),
49 last_buffer_flags(last), 53 last_buffer_flags(last),
50 golden_buffer_flags(golden), 54 golden_buffer_flags(golden),
51 arf_buffer_flags(arf), 55 arf_buffer_flags(arf),
52 layer_sync(layer_sync), 56 layer_sync(layer_sync),
53 freeze_entropy(freeze_entropy) {} 57 freeze_entropy(freeze_entropy) {}
54 58
55 namespace { 59 namespace {
56 60
57 std::vector<unsigned int> GetTemporalIds(size_t num_layers) { 61 std::vector<unsigned int> GetTemporalIds(size_t num_layers) {
58 switch (num_layers) { 62 switch (num_layers) {
(...skipping 20 matching lines...) Expand all
79 // 0 0 ... 83 // 0 0 ...
80 return {0, 3, 2, 3, 1, 3, 2, 3}; 84 return {0, 3, 2, 3, 1, 3, 2, 3};
81 default: 85 default:
82 RTC_NOTREACHED(); 86 RTC_NOTREACHED();
83 break; 87 break;
84 } 88 }
85 RTC_NOTREACHED(); 89 RTC_NOTREACHED();
86 return {0}; 90 return {0};
87 } 91 }
88 92
89 std::vector<TemporalReferences> GetTemporalPattern( 93 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) {
90 size_t num_layers) {
91 // For indexing in the patterns described below (which temporal layers they 94 // For indexing in the patterns described below (which temporal layers they
92 // belong to), see the diagram above. 95 // belong to), see the diagram above.
93 // Layer sync is done similarly for all patterns (except single stream) and 96 // Layer sync is done similarly for all patterns (except single stream) and
94 // happens every 8 frames: 97 // happens every 8 frames:
95 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still 98 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still
96 // updating 'golden', so it can be used as a reference by future TL1 frames. 99 // updating 'golden', so it can be used as a reference by future TL1 frames.
97 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending 100 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending
98 // on TL1's buffer before TL1 has layer synced). 101 // on TL1's buffer before TL1 has layer synced).
99 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for 102 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for
100 // the base layer in 1-3TL instead of 'last' periodically on long intervals, 103 // the base layer in 1-3TL instead of 'last' periodically on long intervals,
101 // so that if scene changes occur (user walks between rooms or rotates webcam) 104 // so that if scene changes occur (user walks between rooms or rotates webcam)
102 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant 105 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant
103 // keyframe. 106 // keyframe.
104 switch (num_layers) { 107 switch (num_layers) {
105 case 1: 108 case 1:
106 // All frames reference all buffers and the 'last' buffer is updated. 109 // All frames reference all buffers and the 'last' buffer is updated.
107 return {TemporalReferences(kReferenceAndUpdate, kReference, kReference)}; 110 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
111 TemporalLayers::kReference,
112 TemporalLayers::kReference)};
108 case 2: 113 case 2:
109 // All layers can reference but not update the 'alt' buffer, this means 114 // All layers can reference but not update the 'alt' buffer, this means
110 // that the 'alt' buffer reference is effectively the last keyframe. 115 // that the 'alt' buffer reference is effectively the last keyframe.
111 // TL0 also references and updates the 'last' buffer. 116 // TL0 also references and updates the 'last' buffer.
112 // TL1 also references 'last' and references and updates 'golden'. 117 // TL1 also references 'last' and references and updates 'golden'.
113 return {TemporalReferences(kReferenceAndUpdate, kUpdate, kReference), 118 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
114 TemporalReferences(kReference, kUpdate, kReference, kLayerSync), 119 TemporalLayers::kUpdate,
115 TemporalReferences(kReferenceAndUpdate, kNone, kReference), 120 TemporalLayers::kReference),
116 TemporalReferences(kReference, kReferenceAndUpdate, kReference), 121 TemporalLayers::FrameConfig(
117 TemporalReferences(kReferenceAndUpdate, kNone, kReference), 122 TemporalLayers::kReference, TemporalLayers::kUpdate,
118 TemporalReferences(kReference, kReferenceAndUpdate, kReference), 123 TemporalLayers::kReference, kLayerSync),
119 TemporalReferences(kReferenceAndUpdate, kNone, kReference), 124 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
120 TemporalReferences(kReference, kReference, kReference, 125 TemporalLayers::kNone,
121 kFreezeEntropy)}; 126 TemporalLayers::kReference),
127 TemporalLayers::FrameConfig(TemporalLayers::kReference,
128 TemporalLayers::kReferenceAndUpdate,
129 TemporalLayers::kReference),
130 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
131 TemporalLayers::kNone,
132 TemporalLayers::kReference),
133 TemporalLayers::FrameConfig(TemporalLayers::kReference,
134 TemporalLayers::kReferenceAndUpdate,
135 TemporalLayers::kReference),
136 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
137 TemporalLayers::kNone,
138 TemporalLayers::kReference),
139 TemporalLayers::FrameConfig(
140 TemporalLayers::kReference, TemporalLayers::kReference,
141 TemporalLayers::kReference, kFreezeEntropy)};
122 case 3: 142 case 3:
123 // All layers can reference but not update the 'alt' buffer, this means 143 // All layers can reference but not update the 'alt' buffer, this means
124 // that the 'alt' buffer reference is effectively the last keyframe. 144 // that the 'alt' buffer reference is effectively the last keyframe.
125 // TL0 also references and updates the 'last' buffer. 145 // TL0 also references and updates the 'last' buffer.
126 // TL1 also references 'last' and references and updates 'golden'. 146 // TL1 also references 'last' and references and updates 'golden'.
127 // TL2 references both 'last' and 'golden' but updates no buffer. 147 // TL2 references both 'last' and 'golden' but updates no buffer.
128 return {TemporalReferences(kReferenceAndUpdate, kUpdate, kReference), 148 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
129 TemporalReferences(kReference, kNone, kReference, 149 TemporalLayers::kUpdate,
130 kLayerSync | kFreezeEntropy), 150 TemporalLayers::kReference),
131 TemporalReferences(kReference, kUpdate, kReference, kLayerSync), 151 TemporalLayers::FrameConfig(
132 TemporalReferences(kReference, kReference, kReference, 152 TemporalLayers::kReference, TemporalLayers::kNone,
133 kFreezeEntropy), 153 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
134 TemporalReferences(kReferenceAndUpdate, kNone, kReference), 154 TemporalLayers::FrameConfig(
135 TemporalReferences(kReference, kReference, kReference, 155 TemporalLayers::kReference, TemporalLayers::kUpdate,
136 kFreezeEntropy), 156 TemporalLayers::kReference, kLayerSync),
137 TemporalReferences(kReference, kReferenceAndUpdate, kReference), 157 TemporalLayers::FrameConfig(
138 TemporalReferences(kReference, kReference, kReference, 158 TemporalLayers::kReference, TemporalLayers::kReference,
139 kFreezeEntropy)}; 159 TemporalLayers::kReference, kFreezeEntropy),
160 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
161 TemporalLayers::kNone,
162 TemporalLayers::kReference),
163 TemporalLayers::FrameConfig(
164 TemporalLayers::kReference, TemporalLayers::kReference,
165 TemporalLayers::kReference, kFreezeEntropy),
166 TemporalLayers::FrameConfig(TemporalLayers::kReference,
167 TemporalLayers::kReferenceAndUpdate,
168 TemporalLayers::kReference),
169 TemporalLayers::FrameConfig(
170 TemporalLayers::kReference, TemporalLayers::kReference,
171 TemporalLayers::kReference, kFreezeEntropy)};
140 case 4: 172 case 4:
141 // TL0 references and updates only the 'last' buffer. 173 // TL0 references and updates only the 'last' buffer.
142 // TL1 references 'last' and updates and references 'golden'. 174 // TL1 references 'last' and updates and references 'golden'.
143 // TL2 references 'last' and 'golden', and references and updates 'arf'. 175 // TL2 references 'last' and 'golden', and references and updates 'arf'.
144 // TL3 references all buffers but update none of them. 176 // TL3 references all buffers but update none of them.
145 return {TemporalReferences(kReferenceAndUpdate, kNone, kNone), 177 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
146 TemporalReferences(kReference, kReference, kReference, 178 TemporalLayers::kNone,
147 kLayerSync | kFreezeEntropy), 179 TemporalLayers::kNone),
148 TemporalReferences(kReference, kNone, kUpdate, kLayerSync), 180 TemporalLayers::FrameConfig(
149 TemporalReferences(kReference, kReference, kReference, 181 TemporalLayers::kReference, TemporalLayers::kReference,
150 kLayerSync | kFreezeEntropy), 182 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
151 TemporalReferences(kReference, kUpdate, kNone, kLayerSync), 183 TemporalLayers::FrameConfig(TemporalLayers::kReference,
152 TemporalReferences(kReference, kReference, kReference, 184 TemporalLayers::kNone,
153 kLayerSync | kFreezeEntropy), 185 TemporalLayers::kUpdate, kLayerSync),
154 TemporalReferences(kReference, kReference, kReferenceAndUpdate), 186 TemporalLayers::FrameConfig(
155 TemporalReferences(kReference, kReference, kReference, 187 TemporalLayers::kReference, TemporalLayers::kReference,
156 kLayerSync | kFreezeEntropy), 188 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
157 TemporalReferences(kReferenceAndUpdate, kNone, kNone), 189 TemporalLayers::FrameConfig(TemporalLayers::kReference,
158 TemporalReferences(kReference, kReference, kReference, 190 TemporalLayers::kUpdate,
159 kLayerSync | kFreezeEntropy), 191 TemporalLayers::kNone, kLayerSync),
160 TemporalReferences(kReference, kReference, kReferenceAndUpdate), 192 TemporalLayers::FrameConfig(
161 TemporalReferences(kReference, kReference, kReference, 193 TemporalLayers::kReference, TemporalLayers::kReference,
162 kLayerSync | kFreezeEntropy), 194 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
163 TemporalReferences(kReference, kReferenceAndUpdate, kNone), 195 TemporalLayers::FrameConfig(TemporalLayers::kReference,
164 TemporalReferences(kReference, kReference, kReference, 196 TemporalLayers::kReference,
165 kLayerSync | kFreezeEntropy), 197 TemporalLayers::kReferenceAndUpdate),
166 TemporalReferences(kReference, kReference, kReferenceAndUpdate), 198 TemporalLayers::FrameConfig(
167 TemporalReferences(kReference, kReference, kReference, 199 TemporalLayers::kReference, TemporalLayers::kReference,
168 kLayerSync | kFreezeEntropy)}; 200 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
201 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
202 TemporalLayers::kNone,
203 TemporalLayers::kNone),
204 TemporalLayers::FrameConfig(
205 TemporalLayers::kReference, TemporalLayers::kReference,
206 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
207 TemporalLayers::FrameConfig(TemporalLayers::kReference,
208 TemporalLayers::kReference,
209 TemporalLayers::kReferenceAndUpdate),
210 TemporalLayers::FrameConfig(
211 TemporalLayers::kReference, TemporalLayers::kReference,
212 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
213 TemporalLayers::FrameConfig(TemporalLayers::kReference,
214 TemporalLayers::kReferenceAndUpdate,
215 TemporalLayers::kNone),
216 TemporalLayers::FrameConfig(
217 TemporalLayers::kReference, TemporalLayers::kReference,
218 TemporalLayers::kReference, kLayerSync | kFreezeEntropy),
219 TemporalLayers::FrameConfig(TemporalLayers::kReference,
220 TemporalLayers::kReference,
221 TemporalLayers::kReferenceAndUpdate),
222 TemporalLayers::FrameConfig(
223 TemporalLayers::kReference, TemporalLayers::kReference,
224 TemporalLayers::kReference, kLayerSync | kFreezeEntropy)};
169 default: 225 default:
170 RTC_NOTREACHED(); 226 RTC_NOTREACHED();
171 break; 227 break;
172 } 228 }
173 RTC_NOTREACHED(); 229 RTC_NOTREACHED();
174 return {TemporalReferences(kNone, kNone, kNone)}; 230 return {TemporalLayers::FrameConfig(
231 TemporalLayers::kNone, TemporalLayers::kNone, TemporalLayers::kNone)};
175 } 232 }
176 233
177 } // namespace 234 } // namespace
178 235
179 DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers, 236 DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers,
180 uint8_t initial_tl0_pic_idx) 237 uint8_t initial_tl0_pic_idx)
181 : num_layers_(std::max(1, number_of_temporal_layers)), 238 : num_layers_(std::max(1, number_of_temporal_layers)),
182 temporal_ids_(GetTemporalIds(num_layers_)), 239 temporal_ids_(GetTemporalIds(num_layers_)),
183 temporal_pattern_(GetTemporalPattern(num_layers_)), 240 temporal_pattern_(GetTemporalPattern(num_layers_)),
184 tl0_pic_idx_(initial_tl0_pic_idx), 241 tl0_pic_idx_(initial_tl0_pic_idx),
185 pattern_idx_(255), 242 pattern_idx_(255),
186 timestamp_(0), 243 timestamp_(0),
187 last_base_layer_sync_(false) { 244 last_base_layer_sync_(false) {
188 RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers); 245 RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers);
189 RTC_CHECK_GE(number_of_temporal_layers, 0); 246 RTC_CHECK_GE(number_of_temporal_layers, 0);
190 RTC_CHECK_LE(number_of_temporal_layers, 4); 247 RTC_CHECK_LE(number_of_temporal_layers, 4);
248 // pattern_idx_ wraps around temporal_pattern_.size, this is incorrect if
249 // temporal_ids_ are ever longer. If this is no longer correct it needs to
250 // wrap at max(temporal_ids_.size(), temporal_pattern_.size()).
251 RTC_DCHECK_LE(temporal_ids_.size(), temporal_pattern_.size());
191 } 252 }
192 253
193 int DefaultTemporalLayers::CurrentLayerId() const { 254 int DefaultTemporalLayers::GetTemporalLayerId(
194 return temporal_ids_[pattern_idx_ % temporal_ids_.size()]; 255 const TemporalLayers::FrameConfig& tl_config) const {
256 RTC_DCHECK(!tl_config.drop_frame);
257 return temporal_ids_[tl_config.pattern_idx % temporal_ids_.size()];
195 } 258 }
196 259
197 uint8_t DefaultTemporalLayers::Tl0PicIdx() const { 260 uint8_t DefaultTemporalLayers::Tl0PicIdx() const {
198 return tl0_pic_idx_; 261 return tl0_pic_idx_;
199 } 262 }
200 263
201 std::vector<uint32_t> DefaultTemporalLayers::OnRatesUpdated( 264 std::vector<uint32_t> DefaultTemporalLayers::OnRatesUpdated(
202 int bitrate_kbps, 265 int bitrate_kbps,
203 int max_bitrate_kbps, 266 int max_bitrate_kbps,
204 int framerate) { 267 int framerate) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 cfg->ts_number_layers = num_layers_; 304 cfg->ts_number_layers = num_layers_;
242 cfg->ts_periodicity = temporal_ids_.size(); 305 cfg->ts_periodicity = temporal_ids_.size();
243 memcpy(cfg->ts_layer_id, &temporal_ids_[0], 306 memcpy(cfg->ts_layer_id, &temporal_ids_[0],
244 sizeof(unsigned int) * temporal_ids_.size()); 307 sizeof(unsigned int) * temporal_ids_.size());
245 308
246 new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>(); 309 new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>();
247 310
248 return true; 311 return true;
249 } 312 }
250 313
251 // TODO(pbos): Name method so that it's obvious that it updates state. 314 TemporalLayers::FrameConfig DefaultTemporalLayers::UpdateLayerConfig(
252 TemporalReferences DefaultTemporalLayers::UpdateLayerConfig(
253 uint32_t timestamp) { 315 uint32_t timestamp) {
254 RTC_DCHECK_GT(num_layers_, 0); 316 RTC_DCHECK_GT(num_layers_, 0);
255 RTC_DCHECK_LT(0, temporal_pattern_.size()); 317 RTC_DCHECK_LT(0, temporal_pattern_.size());
256 return temporal_pattern_[++pattern_idx_ % temporal_pattern_.size()]; 318 pattern_idx_ = (pattern_idx_ + 1) % temporal_pattern_.size();
319 TemporalLayers::FrameConfig tl_config = temporal_pattern_[pattern_idx_];
320 tl_config.pattern_idx = pattern_idx_;
321 return tl_config;
257 } 322 }
258 323
259 void DefaultTemporalLayers::PopulateCodecSpecific( 324 void DefaultTemporalLayers::PopulateCodecSpecific(
260 bool frame_is_keyframe, 325 bool frame_is_keyframe,
326 const TemporalLayers::FrameConfig& tl_config,
261 CodecSpecificInfoVP8* vp8_info, 327 CodecSpecificInfoVP8* vp8_info,
262 uint32_t timestamp) { 328 uint32_t timestamp) {
263 RTC_DCHECK_GT(num_layers_, 0); 329 RTC_DCHECK_GT(num_layers_, 0);
264 330
265 if (num_layers_ == 1) { 331 if (num_layers_ == 1) {
266 vp8_info->temporalIdx = kNoTemporalIdx; 332 vp8_info->temporalIdx = kNoTemporalIdx;
267 vp8_info->layerSync = false; 333 vp8_info->layerSync = false;
268 vp8_info->tl0PicIdx = kNoTl0PicIdx; 334 vp8_info->tl0PicIdx = kNoTl0PicIdx;
269 } else { 335 } else {
270 if (frame_is_keyframe) { 336 if (frame_is_keyframe) {
271 vp8_info->temporalIdx = 0; 337 vp8_info->temporalIdx = 0;
272 vp8_info->layerSync = true; 338 vp8_info->layerSync = true;
273 } else { 339 } else {
274 vp8_info->temporalIdx = CurrentLayerId(); 340 vp8_info->temporalIdx = GetTemporalLayerId(tl_config);
275 TemporalReferences temporal_reference =
276 temporal_pattern_[pattern_idx_ % temporal_pattern_.size()];
277 341
278 vp8_info->layerSync = temporal_reference.layer_sync; 342 vp8_info->layerSync = tl_config.layer_sync;
279 } 343 }
280 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) { 344 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) {
281 // Regardless of pattern the frame after a base layer sync will always 345 // Regardless of pattern the frame after a base layer sync will always
282 // be a layer sync. 346 // be a layer sync.
283 vp8_info->layerSync = true; 347 vp8_info->layerSync = true;
284 } 348 }
285 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) { 349 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) {
286 timestamp_ = timestamp; 350 timestamp_ = timestamp;
287 tl0_pic_idx_++; 351 tl0_pic_idx_++;
288 } 352 }
(...skipping 11 matching lines...) Expand all
300 if (listener_) 364 if (listener_)
301 listener_->OnTemporalLayersCreated(simulcast_id, tl); 365 listener_->OnTemporalLayersCreated(simulcast_id, tl);
302 return tl; 366 return tl;
303 } 367 }
304 368
305 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { 369 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) {
306 listener_ = listener; 370 listener_ = listener;
307 } 371 }
308 372
309 } // namespace webrtc 373 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698