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" |
(...skipping 12 matching lines...) Expand all Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |