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" |
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 Loading... | |
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); |
191 } | 248 } |
192 | 249 |
193 int DefaultTemporalLayers::CurrentLayerId() const { | 250 int DefaultTemporalLayers::GetTemporalLayerId( |
194 return temporal_ids_[pattern_idx_ % temporal_ids_.size()]; | 251 TemporalLayers::FrameConfig tl_config) const { |
252 RTC_DCHECK(!tl_config.drop_frame); | |
253 return temporal_ids_[tl_config.pattern_idx % temporal_ids_.size()]; | |
195 } | 254 } |
196 | 255 |
197 std::vector<uint32_t> DefaultTemporalLayers::OnRatesUpdated( | 256 std::vector<uint32_t> DefaultTemporalLayers::OnRatesUpdated( |
198 int bitrate_kbps, | 257 int bitrate_kbps, |
199 int max_bitrate_kbps, | 258 int max_bitrate_kbps, |
200 int framerate) { | 259 int framerate) { |
201 std::vector<uint32_t> bitrates; | 260 std::vector<uint32_t> bitrates; |
202 for (size_t i = 0; i < num_layers_; ++i) { | 261 for (size_t i = 0; i < num_layers_; ++i) { |
203 float layer_bitrate = | 262 float layer_bitrate = |
204 bitrate_kbps * kVp8LayerRateAlloction[num_layers_ - 1][i]; | 263 bitrate_kbps * kVp8LayerRateAlloction[num_layers_ - 1][i]; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
237 cfg->ts_number_layers = num_layers_; | 296 cfg->ts_number_layers = num_layers_; |
238 cfg->ts_periodicity = temporal_ids_.size(); | 297 cfg->ts_periodicity = temporal_ids_.size(); |
239 memcpy(cfg->ts_layer_id, &temporal_ids_[0], | 298 memcpy(cfg->ts_layer_id, &temporal_ids_[0], |
240 sizeof(unsigned int) * temporal_ids_.size()); | 299 sizeof(unsigned int) * temporal_ids_.size()); |
241 | 300 |
242 new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>(); | 301 new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>(); |
243 | 302 |
244 return true; | 303 return true; |
245 } | 304 } |
246 | 305 |
247 // TODO(pbos): Name method so that it's obvious that it updates state. | 306 // TODO(pbos): Name method so that it's obvious that it updates state. |
sprang_webrtc
2017/05/03 15:18:43
Remove todo?
pbos-webrtc
2017/05/04 10:52:22
Done.
| |
248 TemporalReferences DefaultTemporalLayers::UpdateLayerConfig( | 307 TemporalLayers::FrameConfig DefaultTemporalLayers::UpdateLayerConfig( |
249 uint32_t timestamp) { | 308 uint32_t timestamp) { |
250 RTC_DCHECK_GT(num_layers_, 0); | 309 RTC_DCHECK_GT(num_layers_, 0); |
251 RTC_DCHECK_LT(0, temporal_pattern_.size()); | 310 RTC_DCHECK_LT(0, temporal_pattern_.size()); |
252 return temporal_pattern_[++pattern_idx_ % temporal_pattern_.size()]; | 311 int pattern_idx = ++pattern_idx_; |
sprang_webrtc
2017/05/03 15:18:43
Is it intentional that we let pattern_idx_ go up t
pbos-webrtc
2017/05/04 10:52:22
Did as suggested (explicitly wrap). I added a DCHE
| |
312 TemporalLayers::FrameConfig tl_config = | |
313 temporal_pattern_[pattern_idx_ % temporal_pattern_.size()]; | |
314 tl_config.pattern_idx = pattern_idx; | |
315 return tl_config; | |
253 } | 316 } |
254 | 317 |
255 void DefaultTemporalLayers::PopulateCodecSpecific( | 318 void DefaultTemporalLayers::PopulateCodecSpecific( |
256 bool frame_is_keyframe, | 319 bool frame_is_keyframe, |
320 TemporalLayers::FrameConfig tl_config, | |
257 CodecSpecificInfoVP8* vp8_info, | 321 CodecSpecificInfoVP8* vp8_info, |
258 uint32_t timestamp) { | 322 uint32_t timestamp) { |
259 RTC_DCHECK_GT(num_layers_, 0); | 323 RTC_DCHECK_GT(num_layers_, 0); |
260 | 324 |
261 if (num_layers_ == 1) { | 325 if (num_layers_ == 1) { |
262 vp8_info->temporalIdx = kNoTemporalIdx; | 326 vp8_info->temporalIdx = kNoTemporalIdx; |
263 vp8_info->layerSync = false; | 327 vp8_info->layerSync = false; |
264 vp8_info->tl0PicIdx = kNoTl0PicIdx; | 328 vp8_info->tl0PicIdx = kNoTl0PicIdx; |
265 } else { | 329 } else { |
266 if (frame_is_keyframe) { | 330 if (frame_is_keyframe) { |
267 vp8_info->temporalIdx = 0; | 331 vp8_info->temporalIdx = 0; |
268 vp8_info->layerSync = true; | 332 vp8_info->layerSync = true; |
269 } else { | 333 } else { |
270 vp8_info->temporalIdx = CurrentLayerId(); | 334 vp8_info->temporalIdx = GetTemporalLayerId(tl_config); |
271 TemporalReferences temporal_reference = | |
272 temporal_pattern_[pattern_idx_ % temporal_pattern_.size()]; | |
273 | 335 |
274 vp8_info->layerSync = temporal_reference.layer_sync; | 336 vp8_info->layerSync = tl_config.layer_sync; |
275 } | 337 } |
276 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) { | 338 if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) { |
277 // Regardless of pattern the frame after a base layer sync will always | 339 // Regardless of pattern the frame after a base layer sync will always |
278 // be a layer sync. | 340 // be a layer sync. |
279 vp8_info->layerSync = true; | 341 vp8_info->layerSync = true; |
280 } | 342 } |
281 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) { | 343 if (vp8_info->temporalIdx == 0 && timestamp != timestamp_) { |
282 timestamp_ = timestamp; | 344 timestamp_ = timestamp; |
283 tl0_pic_idx_++; | 345 tl0_pic_idx_++; |
284 } | 346 } |
(...skipping 11 matching lines...) Expand all Loading... | |
296 if (listener_) | 358 if (listener_) |
297 listener_->OnTemporalLayersCreated(simulcast_id, tl); | 359 listener_->OnTemporalLayersCreated(simulcast_id, tl); |
298 return tl; | 360 return tl; |
299 } | 361 } |
300 | 362 |
301 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { | 363 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { |
302 listener_ = listener; | 364 listener_ = listener; |
303 } | 365 } |
304 | 366 |
305 } // namespace webrtc | 367 } // namespace webrtc |
OLD | NEW |