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

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

Issue 2860063002: Remove layer_sync from TL frame config. (Closed)
Patch Set: remove enum 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"
(...skipping 12 matching lines...) Expand all
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 TemporalLayers::FrameConfig::FrameConfig() {} 28 TemporalLayers::FrameConfig::FrameConfig() {}
29 29
30 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, 30 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
31 TemporalLayers::BufferFlags golden, 31 TemporalLayers::BufferFlags golden,
32 TemporalLayers::BufferFlags arf) 32 TemporalLayers::BufferFlags arf)
33 : FrameConfig(last, golden, arf, false, false) {} 33 : FrameConfig(last, golden, arf, false) {}
34 34
35 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, 35 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
36 TemporalLayers::BufferFlags golden, 36 TemporalLayers::BufferFlags golden,
37 TemporalLayers::BufferFlags arf, 37 TemporalLayers::BufferFlags arf,
38 int extra_flags) 38 FreezeEntropy)
39 : FrameConfig(last, 39 : FrameConfig(last, golden, arf, true) {}
40 golden,
41 arf,
42 (extra_flags & kLayerSync) != 0,
43 (extra_flags & kFreezeEntropy) != 0) {}
44 40
45 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last, 41 TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
46 TemporalLayers::BufferFlags golden, 42 TemporalLayers::BufferFlags golden,
47 TemporalLayers::BufferFlags arf, 43 TemporalLayers::BufferFlags arf,
48 bool layer_sync,
49 bool freeze_entropy) 44 bool freeze_entropy)
50 : drop_frame(last == TemporalLayers::kNone && 45 : drop_frame(last == TemporalLayers::kNone &&
51 golden == TemporalLayers::kNone && 46 golden == TemporalLayers::kNone &&
52 arf == TemporalLayers::kNone), 47 arf == TemporalLayers::kNone),
53 last_buffer_flags(last), 48 last_buffer_flags(last),
54 golden_buffer_flags(golden), 49 golden_buffer_flags(golden),
55 arf_buffer_flags(arf), 50 arf_buffer_flags(arf),
56 layer_sync(layer_sync),
57 freeze_entropy(freeze_entropy) {} 51 freeze_entropy(freeze_entropy) {}
58 52
59 namespace { 53 namespace {
60 54
61 std::vector<unsigned int> GetTemporalIds(size_t num_layers) { 55 std::vector<unsigned int> GetTemporalIds(size_t num_layers) {
62 switch (num_layers) { 56 switch (num_layers) {
63 case 1: 57 case 1:
64 // Temporal layer structure (single layer): 58 // Temporal layer structure (single layer):
65 // 0 0 0 0 ... 59 // 0 0 0 0 ...
66 return {0}; 60 return {0};
(...skipping 16 matching lines...) Expand all
83 // 0 0 ... 77 // 0 0 ...
84 return {0, 3, 2, 3, 1, 3, 2, 3}; 78 return {0, 3, 2, 3, 1, 3, 2, 3};
85 default: 79 default:
86 RTC_NOTREACHED(); 80 RTC_NOTREACHED();
87 break; 81 break;
88 } 82 }
89 RTC_NOTREACHED(); 83 RTC_NOTREACHED();
90 return {0}; 84 return {0};
91 } 85 }
92 86
87 std::vector<bool> GetTemporalLayerSync(size_t num_layers) {
88 switch (num_layers) {
89 case 1:
90 return {false};
91 case 2:
92 return {false, true, false, false, false, false, false, false};
93 case 3:
94 return {false, true, true, false, false, false, false, false};
95 case 4:
96 return {false, true, true, true, true, true, false, true,
97 false, true, false, true, false, true, false, true};
98 default:
99 RTC_NOTREACHED();
100 break;
101 }
102 RTC_NOTREACHED();
103 return {false};
104 }
105
93 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { 106 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) {
94 // For indexing in the patterns described below (which temporal layers they 107 // For indexing in the patterns described below (which temporal layers they
95 // belong to), see the diagram above. 108 // belong to), see the diagram above.
96 // Layer sync is done similarly for all patterns (except single stream) and 109 // Layer sync is done similarly for all patterns (except single stream) and
97 // happens every 8 frames: 110 // happens every 8 frames:
98 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still 111 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still
99 // updating 'golden', so it can be used as a reference by future TL1 frames. 112 // updating 'golden', so it can be used as a reference by future TL1 frames.
100 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending 113 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending
101 // on TL1's buffer before TL1 has layer synced). 114 // on TL1's buffer before TL1 has layer synced).
102 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for 115 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for
103 // the base layer in 1-3TL instead of 'last' periodically on long intervals, 116 // the base layer in 1-3TL instead of 'last' periodically on long intervals,
104 // so that if scene changes occur (user walks between rooms or rotates webcam) 117 // so that if scene changes occur (user walks between rooms or rotates webcam)
105 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant 118 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant
106 // keyframe. 119 // keyframe.
107 switch (num_layers) { 120 switch (num_layers) {
108 case 1: 121 case 1:
109 // All frames reference all buffers and the 'last' buffer is updated. 122 // All frames reference all buffers and the 'last' buffer is updated.
110 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 123 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
111 TemporalLayers::kReference, 124 TemporalLayers::kReference,
112 TemporalLayers::kReference)}; 125 TemporalLayers::kReference)};
113 case 2: 126 case 2:
114 // All layers can reference but not update the 'alt' buffer, this means 127 // All layers can reference but not update the 'alt' buffer, this means
115 // that the 'alt' buffer reference is effectively the last keyframe. 128 // that the 'alt' buffer reference is effectively the last keyframe.
116 // TL0 also references and updates the 'last' buffer. 129 // TL0 also references and updates the 'last' buffer.
117 // TL1 also references 'last' and references and updates 'golden'. 130 // TL1 also references 'last' and references and updates 'golden'.
118 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 131 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
119 TemporalLayers::kUpdate, 132 TemporalLayers::kUpdate,
120 TemporalLayers::kReference), 133 TemporalLayers::kReference),
121 TemporalLayers::FrameConfig( 134 TemporalLayers::FrameConfig(TemporalLayers::kReference,
122 TemporalLayers::kReference, TemporalLayers::kUpdate, 135 TemporalLayers::kUpdate,
123 TemporalLayers::kReference, kLayerSync), 136 TemporalLayers::kReference),
124 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 137 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
125 TemporalLayers::kNone, 138 TemporalLayers::kNone,
126 TemporalLayers::kReference), 139 TemporalLayers::kReference),
127 TemporalLayers::FrameConfig(TemporalLayers::kReference, 140 TemporalLayers::FrameConfig(TemporalLayers::kReference,
128 TemporalLayers::kReferenceAndUpdate, 141 TemporalLayers::kReferenceAndUpdate,
129 TemporalLayers::kReference), 142 TemporalLayers::kReference),
130 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 143 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
131 TemporalLayers::kNone, 144 TemporalLayers::kNone,
132 TemporalLayers::kReference), 145 TemporalLayers::kReference),
133 TemporalLayers::FrameConfig(TemporalLayers::kReference, 146 TemporalLayers::FrameConfig(TemporalLayers::kReference,
134 TemporalLayers::kReferenceAndUpdate, 147 TemporalLayers::kReferenceAndUpdate,
135 TemporalLayers::kReference), 148 TemporalLayers::kReference),
136 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 149 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
137 TemporalLayers::kNone, 150 TemporalLayers::kNone,
138 TemporalLayers::kReference), 151 TemporalLayers::kReference),
139 TemporalLayers::FrameConfig( 152 TemporalLayers::FrameConfig(
140 TemporalLayers::kReference, TemporalLayers::kReference, 153 TemporalLayers::kReference, TemporalLayers::kReference,
141 TemporalLayers::kReference, kFreezeEntropy)}; 154 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
142 case 3: 155 case 3:
143 // All layers can reference but not update the 'alt' buffer, this means 156 // All layers can reference but not update the 'alt' buffer, this means
144 // that the 'alt' buffer reference is effectively the last keyframe. 157 // that the 'alt' buffer reference is effectively the last keyframe.
145 // TL0 also references and updates the 'last' buffer. 158 // TL0 also references and updates the 'last' buffer.
146 // TL1 also references 'last' and references and updates 'golden'. 159 // TL1 also references 'last' and references and updates 'golden'.
147 // TL2 references both 'last' and 'golden' but updates no buffer. 160 // TL2 references both 'last' and 'golden' but updates no buffer.
148 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 161 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
149 TemporalLayers::kUpdate, 162 TemporalLayers::kUpdate,
150 TemporalLayers::kReference), 163 TemporalLayers::kReference),
151 TemporalLayers::FrameConfig( 164 TemporalLayers::FrameConfig(
152 TemporalLayers::kReference, TemporalLayers::kNone, 165 TemporalLayers::kReference, TemporalLayers::kNone,
153 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 166 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
154 TemporalLayers::FrameConfig( 167 TemporalLayers::FrameConfig(TemporalLayers::kReference,
155 TemporalLayers::kReference, TemporalLayers::kUpdate, 168 TemporalLayers::kUpdate,
156 TemporalLayers::kReference, kLayerSync), 169 TemporalLayers::kReference),
157 TemporalLayers::FrameConfig( 170 TemporalLayers::FrameConfig(
158 TemporalLayers::kReference, TemporalLayers::kReference, 171 TemporalLayers::kReference, TemporalLayers::kReference,
159 TemporalLayers::kReference, kFreezeEntropy), 172 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
160 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 173 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
161 TemporalLayers::kNone, 174 TemporalLayers::kNone,
162 TemporalLayers::kReference), 175 TemporalLayers::kReference),
163 TemporalLayers::FrameConfig( 176 TemporalLayers::FrameConfig(
164 TemporalLayers::kReference, TemporalLayers::kReference, 177 TemporalLayers::kReference, TemporalLayers::kReference,
165 TemporalLayers::kReference, kFreezeEntropy), 178 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
166 TemporalLayers::FrameConfig(TemporalLayers::kReference, 179 TemporalLayers::FrameConfig(TemporalLayers::kReference,
167 TemporalLayers::kReferenceAndUpdate, 180 TemporalLayers::kReferenceAndUpdate,
168 TemporalLayers::kReference), 181 TemporalLayers::kReference),
169 TemporalLayers::FrameConfig( 182 TemporalLayers::FrameConfig(
170 TemporalLayers::kReference, TemporalLayers::kReference, 183 TemporalLayers::kReference, TemporalLayers::kReference,
171 TemporalLayers::kReference, kFreezeEntropy)}; 184 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
172 case 4: 185 case 4:
173 // TL0 references and updates only the 'last' buffer. 186 // TL0 references and updates only the 'last' buffer.
174 // TL1 references 'last' and updates and references 'golden'. 187 // TL1 references 'last' and updates and references 'golden'.
175 // TL2 references 'last' and 'golden', and references and updates 'arf'. 188 // TL2 references 'last' and 'golden', and references and updates 'arf'.
176 // TL3 references all buffers but update none of them. 189 // TL3 references all buffers but update none of them.
177 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 190 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
178 TemporalLayers::kNone, 191 TemporalLayers::kNone,
179 TemporalLayers::kNone), 192 TemporalLayers::kNone),
180 TemporalLayers::FrameConfig( 193 TemporalLayers::FrameConfig(
181 TemporalLayers::kReference, TemporalLayers::kReference, 194 TemporalLayers::kReference, TemporalLayers::kReference,
182 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 195 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
183 TemporalLayers::FrameConfig(TemporalLayers::kReference, 196 TemporalLayers::FrameConfig(TemporalLayers::kReference,
184 TemporalLayers::kNone, 197 TemporalLayers::kNone,
185 TemporalLayers::kUpdate, kLayerSync), 198 TemporalLayers::kUpdate),
186 TemporalLayers::FrameConfig( 199 TemporalLayers::FrameConfig(
187 TemporalLayers::kReference, TemporalLayers::kReference, 200 TemporalLayers::kReference, TemporalLayers::kReference,
188 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 201 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
189 TemporalLayers::FrameConfig(TemporalLayers::kReference, 202 TemporalLayers::FrameConfig(TemporalLayers::kReference,
190 TemporalLayers::kUpdate, 203 TemporalLayers::kUpdate,
191 TemporalLayers::kNone, kLayerSync), 204 TemporalLayers::kNone),
192 TemporalLayers::FrameConfig( 205 TemporalLayers::FrameConfig(
193 TemporalLayers::kReference, TemporalLayers::kReference, 206 TemporalLayers::kReference, TemporalLayers::kReference,
194 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 207 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
195 TemporalLayers::FrameConfig(TemporalLayers::kReference, 208 TemporalLayers::FrameConfig(TemporalLayers::kReference,
196 TemporalLayers::kReference, 209 TemporalLayers::kReference,
197 TemporalLayers::kReferenceAndUpdate), 210 TemporalLayers::kReferenceAndUpdate),
198 TemporalLayers::FrameConfig( 211 TemporalLayers::FrameConfig(
199 TemporalLayers::kReference, TemporalLayers::kReference, 212 TemporalLayers::kReference, TemporalLayers::kReference,
200 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 213 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
201 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, 214 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
202 TemporalLayers::kNone, 215 TemporalLayers::kNone,
203 TemporalLayers::kNone), 216 TemporalLayers::kNone),
204 TemporalLayers::FrameConfig( 217 TemporalLayers::FrameConfig(
205 TemporalLayers::kReference, TemporalLayers::kReference, 218 TemporalLayers::kReference, TemporalLayers::kReference,
206 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 219 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
207 TemporalLayers::FrameConfig(TemporalLayers::kReference, 220 TemporalLayers::FrameConfig(TemporalLayers::kReference,
208 TemporalLayers::kReference, 221 TemporalLayers::kReference,
209 TemporalLayers::kReferenceAndUpdate), 222 TemporalLayers::kReferenceAndUpdate),
210 TemporalLayers::FrameConfig( 223 TemporalLayers::FrameConfig(
211 TemporalLayers::kReference, TemporalLayers::kReference, 224 TemporalLayers::kReference, TemporalLayers::kReference,
212 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 225 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
213 TemporalLayers::FrameConfig(TemporalLayers::kReference, 226 TemporalLayers::FrameConfig(TemporalLayers::kReference,
214 TemporalLayers::kReferenceAndUpdate, 227 TemporalLayers::kReferenceAndUpdate,
215 TemporalLayers::kNone), 228 TemporalLayers::kNone),
216 TemporalLayers::FrameConfig( 229 TemporalLayers::FrameConfig(
217 TemporalLayers::kReference, TemporalLayers::kReference, 230 TemporalLayers::kReference, TemporalLayers::kReference,
218 TemporalLayers::kReference, kLayerSync | kFreezeEntropy), 231 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
219 TemporalLayers::FrameConfig(TemporalLayers::kReference, 232 TemporalLayers::FrameConfig(TemporalLayers::kReference,
220 TemporalLayers::kReference, 233 TemporalLayers::kReference,
221 TemporalLayers::kReferenceAndUpdate), 234 TemporalLayers::kReferenceAndUpdate),
222 TemporalLayers::FrameConfig( 235 TemporalLayers::FrameConfig(
223 TemporalLayers::kReference, TemporalLayers::kReference, 236 TemporalLayers::kReference, TemporalLayers::kReference,
224 TemporalLayers::kReference, kLayerSync | kFreezeEntropy)}; 237 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
225 default: 238 default:
226 RTC_NOTREACHED(); 239 RTC_NOTREACHED();
227 break; 240 break;
228 } 241 }
229 RTC_NOTREACHED(); 242 RTC_NOTREACHED();
230 return {TemporalLayers::FrameConfig( 243 return {TemporalLayers::FrameConfig(
231 TemporalLayers::kNone, TemporalLayers::kNone, TemporalLayers::kNone)}; 244 TemporalLayers::kNone, TemporalLayers::kNone, TemporalLayers::kNone)};
232 } 245 }
233 246
234 } // namespace 247 } // namespace
235 248
236 DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers, 249 DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers,
237 uint8_t initial_tl0_pic_idx) 250 uint8_t initial_tl0_pic_idx)
238 : num_layers_(std::max(1, number_of_temporal_layers)), 251 : num_layers_(std::max(1, number_of_temporal_layers)),
239 temporal_ids_(GetTemporalIds(num_layers_)), 252 temporal_ids_(GetTemporalIds(num_layers_)),
253 temporal_layer_sync_(GetTemporalLayerSync(num_layers_)),
240 temporal_pattern_(GetTemporalPattern(num_layers_)), 254 temporal_pattern_(GetTemporalPattern(num_layers_)),
241 tl0_pic_idx_(initial_tl0_pic_idx), 255 tl0_pic_idx_(initial_tl0_pic_idx),
242 pattern_idx_(255), 256 pattern_idx_(255),
243 timestamp_(0), 257 timestamp_(0),
244 last_base_layer_sync_(false) { 258 last_base_layer_sync_(false) {
259 RTC_DCHECK_EQ(temporal_pattern_.size(), temporal_layer_sync_.size());
245 RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers); 260 RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers);
246 RTC_CHECK_GE(number_of_temporal_layers, 0); 261 RTC_CHECK_GE(number_of_temporal_layers, 0);
247 RTC_CHECK_LE(number_of_temporal_layers, 4); 262 RTC_CHECK_LE(number_of_temporal_layers, 4);
248 // pattern_idx_ wraps around temporal_pattern_.size, this is incorrect if 263 // 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 264 // temporal_ids_ are ever longer. If this is no longer correct it needs to
250 // wrap at max(temporal_ids_.size(), temporal_pattern_.size()). 265 // wrap at max(temporal_ids_.size(), temporal_pattern_.size()).
251 RTC_DCHECK_LE(temporal_ids_.size(), temporal_pattern_.size()); 266 RTC_DCHECK_LE(temporal_ids_.size(), temporal_pattern_.size());
252 } 267 }
253 268
254 int DefaultTemporalLayers::GetTemporalLayerId( 269 int DefaultTemporalLayers::GetTemporalLayerId(
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 vp8_info->temporalIdx = kNoTemporalIdx; 347 vp8_info->temporalIdx = kNoTemporalIdx;
333 vp8_info->layerSync = false; 348 vp8_info->layerSync = false;
334 vp8_info->tl0PicIdx = kNoTl0PicIdx; 349 vp8_info->tl0PicIdx = kNoTl0PicIdx;
335 } else { 350 } else {
336 if (frame_is_keyframe) { 351 if (frame_is_keyframe) {
337 vp8_info->temporalIdx = 0; 352 vp8_info->temporalIdx = 0;
338 vp8_info->layerSync = true; 353 vp8_info->layerSync = true;
339 } else { 354 } else {
340 vp8_info->temporalIdx = GetTemporalLayerId(tl_config); 355 vp8_info->temporalIdx = GetTemporalLayerId(tl_config);
341 356
342 vp8_info->layerSync = tl_config.layer_sync; 357 vp8_info->layerSync = temporal_layer_sync_[tl_config.pattern_idx %
358 temporal_layer_sync_.size()];
343 } 359 }
344 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) { 360 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) {
345 // Regardless of pattern the frame after a base layer sync will always 361 // Regardless of pattern the frame after a base layer sync will always
346 // be a layer sync. 362 // be a layer sync.
347 vp8_info->layerSync = true; 363 vp8_info->layerSync = true;
348 } 364 }
349 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) { 365 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) {
350 timestamp_ = timestamp; 366 timestamp_ = timestamp;
351 tl0_pic_idx_++; 367 tl0_pic_idx_++;
352 } 368 }
(...skipping 11 matching lines...) Expand all
364 if (listener_) 380 if (listener_)
365 listener_->OnTemporalLayersCreated(simulcast_id, tl); 381 listener_->OnTemporalLayersCreated(simulcast_id, tl);
366 return tl; 382 return tl;
367 } 383 }
368 384
369 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { 385 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) {
370 listener_ = listener; 386 listener_ = listener;
371 } 387 }
372 388
373 } // namespace webrtc 389 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698