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); |
| 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 Loading... |
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 Loading... |
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 |
OLD | NEW |