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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
88 RTC_NOTREACHED(); | 88 RTC_NOTREACHED(); |
89 return {0}; | 89 return {0}; |
90 } | 90 } |
91 | 91 |
92 std::vector<bool> GetTemporalLayerSync(size_t num_layers) { | 92 std::vector<bool> GetTemporalLayerSync(size_t num_layers) { |
93 switch (num_layers) { | 93 switch (num_layers) { |
94 case 1: | 94 case 1: |
95 return {false}; | 95 return {false}; |
96 case 2: | 96 case 2: |
97 return {false, true, false, false, false, false, false, false}; | 97 return {false, true, false, false, false, false, false, false}; |
98 case 3: | 98 case 3: { |
99 return {false, true, true, false, false, false, false, false}; | 99 std::vector<bool> sync_pattern = {false, true, true, false, |
100 false, false, false, false}; | |
101 if (field_trial::IsEnabled("WebRTC-AltTemporalLayers")) | |
pbos1
2017/08/31 19:54:38
Actually if this is not supposed to be a subset be
pbos1
2017/08/31 19:54:38
Also do you think we could generate GetTemporalLay
sprang_webrtc
2017/09/01 14:32:56
Potentially, but it's not super straight forward.
sprang_webrtc
2017/09/01 14:32:56
Done.
| |
102 sync_pattern.resize(4); | |
103 return sync_pattern; | |
104 } | |
100 case 4: | 105 case 4: |
101 return {false, true, true, true, true, true, false, true, | 106 return {false, true, true, false, true, false, false, false, |
102 false, true, false, true, false, true, false, true}; | 107 false, false, false, false, false, false, false, false}; |
103 default: | 108 default: |
104 RTC_NOTREACHED(); | |
105 break; | 109 break; |
106 } | 110 } |
107 RTC_NOTREACHED(); | 111 RTC_NOTREACHED() << num_layers; |
108 return {false}; | 112 return {}; |
109 } | 113 } |
110 | 114 |
111 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { | 115 std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) { |
112 // For indexing in the patterns described below (which temporal layers they | 116 // For indexing in the patterns described below (which temporal layers they |
113 // belong to), see the diagram above. | 117 // belong to), see the diagram above. |
114 // Layer sync is done similarly for all patterns (except single stream) and | 118 // Layer sync is done similarly for all patterns (except single stream) and |
115 // happens every 8 frames: | 119 // happens every 8 frames: |
116 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still | 120 // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still |
117 // updating 'golden', so it can be used as a reference by future TL1 frames. | 121 // updating 'golden', so it can be used as a reference by future TL1 frames. |
118 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending | 122 // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending |
119 // on TL1's buffer before TL1 has layer synced). | 123 // on TL1's buffer before TL1 has layer synced). |
120 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for | 124 // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for |
121 // the base layer in 1-3TL instead of 'last' periodically on long intervals, | 125 // the base layer in 1-3TL instead of 'last' periodically on long intervals, |
122 // so that if scene changes occur (user walks between rooms or rotates webcam) | 126 // so that if scene changes occur (user walks between rooms or rotates webcam) |
123 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant | 127 // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant |
124 // keyframe. | 128 // keyframe. |
125 switch (num_layers) { | 129 switch (num_layers) { |
126 case 1: | 130 case 1: |
127 // All frames reference all buffers and the 'last' buffer is updated. | 131 // All frames reference all buffers and the 'last' buffer is updated. |
128 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 132 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
129 TemporalLayers::kReference, | 133 TemporalLayers::kReference, |
130 TemporalLayers::kReference)}; | 134 TemporalLayers::kReference)}; |
131 case 2: | 135 case 2: |
132 // All layers can reference but not update the 'alt' buffer, this means | 136 // All layers can reference but not update the 'alt' buffer, this means |
133 // that the 'alt' buffer reference is effectively the last keyframe. | 137 // that the 'alt' buffer reference is effectively the last keyframe. |
134 // TL0 also references and updates the 'last' buffer. | 138 // TL0 also references and updates the 'last' buffer. |
135 // TL1 also references 'last' and references and updates 'golden'. | 139 // TL1 also references 'last' and references and updates 'golden'. |
136 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 140 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
137 TemporalLayers::kUpdate, | 141 TemporalLayers::kNone, |
138 TemporalLayers::kReference), | 142 TemporalLayers::kReference), |
139 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 143 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
140 TemporalLayers::kUpdate, | 144 TemporalLayers::kUpdate, |
141 TemporalLayers::kReference), | 145 TemporalLayers::kReference), |
142 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 146 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
143 TemporalLayers::kNone, | 147 TemporalLayers::kNone, |
144 TemporalLayers::kReference), | 148 TemporalLayers::kReference), |
145 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 149 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
146 TemporalLayers::kReferenceAndUpdate, | 150 TemporalLayers::kReferenceAndUpdate, |
147 TemporalLayers::kReference), | 151 TemporalLayers::kReference), |
148 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 152 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
149 TemporalLayers::kNone, | 153 TemporalLayers::kNone, |
150 TemporalLayers::kReference), | 154 TemporalLayers::kReference), |
151 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 155 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
152 TemporalLayers::kReferenceAndUpdate, | 156 TemporalLayers::kReferenceAndUpdate, |
153 TemporalLayers::kReference), | 157 TemporalLayers::kReference), |
154 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 158 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
155 TemporalLayers::kNone, | 159 TemporalLayers::kNone, |
156 TemporalLayers::kReference), | 160 TemporalLayers::kReference), |
157 TemporalLayers::FrameConfig( | 161 TemporalLayers::FrameConfig( |
158 TemporalLayers::kReference, TemporalLayers::kReference, | 162 TemporalLayers::kReference, TemporalLayers::kReference, |
159 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; | 163 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; |
160 case 3: | 164 case 3: |
161 // All layers can reference but not update the 'alt' buffer, this means | 165 if (field_trial::IsEnabled("WebRTC-AltTemporalLayers")) { |
pbos1
2017/08/31 19:54:38
Can you put down here why this is meaningfully dif
sprang_webrtc
2017/09/01 14:32:56
Done.
| |
162 // that the 'alt' buffer reference is effectively the last keyframe. | 166 // TL0 references and updates the 'last' buffer. |
163 // TL0 also references and updates the 'last' buffer. | 167 // TL1 references 'last' and references and updates 'golden'. |
164 // TL1 also references 'last' and references and updates 'golden'. | 168 // TL2 references both 'last' & 'golden' and references and updates |
165 // TL2 references both 'last' and 'golden' but updates no buffer. | 169 // 'arf'. |
166 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 170 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
167 TemporalLayers::kUpdate, | 171 TemporalLayers::kNone, |
168 TemporalLayers::kReference), | 172 TemporalLayers::kNone), |
169 TemporalLayers::FrameConfig( | 173 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
170 TemporalLayers::kReference, TemporalLayers::kNone, | 174 TemporalLayers::kNone, |
171 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 175 TemporalLayers::kUpdate), |
172 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 176 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
173 TemporalLayers::kUpdate, | 177 TemporalLayers::kUpdate, |
174 TemporalLayers::kReference), | 178 TemporalLayers::kNone), |
175 TemporalLayers::FrameConfig( | 179 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
176 TemporalLayers::kReference, TemporalLayers::kReference, | 180 TemporalLayers::kReference, |
177 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 181 TemporalLayers::kReference, |
178 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 182 TemporalLayers::kFreezeEntropy)}; |
179 TemporalLayers::kNone, | 183 } else { |
180 TemporalLayers::kReference), | 184 // All layers can reference but not update the 'alt' buffer, this means |
181 TemporalLayers::FrameConfig( | 185 // that the 'alt' buffer reference is effectively the last keyframe. |
182 TemporalLayers::kReference, TemporalLayers::kReference, | 186 // TL0 also references and updates the 'last' buffer. |
183 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 187 // TL1 also references 'last' and references and updates 'golden'. |
184 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 188 // TL2 references both 'last' and 'golden' but updates no buffer. |
185 TemporalLayers::kReferenceAndUpdate, | 189 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
186 TemporalLayers::kReference), | 190 TemporalLayers::kNone, |
187 TemporalLayers::FrameConfig( | 191 TemporalLayers::kReference), |
188 TemporalLayers::kReference, TemporalLayers::kReference, | 192 TemporalLayers::FrameConfig( |
189 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)}; | 193 TemporalLayers::kReference, TemporalLayers::kNone, |
194 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | |
195 TemporalLayers::FrameConfig(TemporalLayers::kReference, | |
196 TemporalLayers::kUpdate, | |
197 TemporalLayers::kReference), | |
198 TemporalLayers::FrameConfig( | |
199 TemporalLayers::kReference, TemporalLayers::kReference, | |
200 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | |
201 TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | |
202 TemporalLayers::kNone, | |
203 TemporalLayers::kReference), | |
204 TemporalLayers::FrameConfig( | |
205 TemporalLayers::kReference, TemporalLayers::kReference, | |
206 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | |
207 TemporalLayers::FrameConfig(TemporalLayers::kReference, | |
208 TemporalLayers::kReferenceAndUpdate, | |
209 TemporalLayers::kReference), | |
210 TemporalLayers::FrameConfig(TemporalLayers::kReference, | |
211 TemporalLayers::kReference, | |
212 TemporalLayers::kReference, | |
213 TemporalLayers::kFreezeEntropy)}; | |
214 } | |
190 case 4: | 215 case 4: |
191 // TL0 references and updates only the 'last' buffer. | 216 // TL0 references and updates only the 'last' buffer. |
192 // TL1 references 'last' and updates and references 'golden'. | 217 // TL1 references 'last' and updates and references 'golden'. |
193 // TL2 references 'last' and 'golden', and references and updates 'arf'. | 218 // TL2 references 'last' and 'golden', and references and updates 'arf'. |
194 // TL3 references all buffers but update none of them. | 219 // TL3 references all buffers but update none of them. |
195 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, | 220 return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate, |
196 TemporalLayers::kNone, | 221 TemporalLayers::kNone, |
197 TemporalLayers::kNone), | 222 TemporalLayers::kNone), |
198 TemporalLayers::FrameConfig( | 223 TemporalLayers::FrameConfig( |
199 TemporalLayers::kReference, TemporalLayers::kReference, | 224 TemporalLayers::kReference, TemporalLayers::kNone, |
200 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 225 TemporalLayers::kNone, TemporalLayers::kFreezeEntropy), |
201 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 226 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
202 TemporalLayers::kNone, | 227 TemporalLayers::kNone, |
203 TemporalLayers::kUpdate), | 228 TemporalLayers::kUpdate), |
204 TemporalLayers::FrameConfig( | 229 TemporalLayers::FrameConfig( |
205 TemporalLayers::kReference, TemporalLayers::kReference, | 230 TemporalLayers::kReference, TemporalLayers::kNone, |
206 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 231 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
207 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 232 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
208 TemporalLayers::kUpdate, | 233 TemporalLayers::kUpdate, |
209 TemporalLayers::kNone), | 234 TemporalLayers::kNone), |
210 TemporalLayers::FrameConfig( | 235 TemporalLayers::FrameConfig( |
211 TemporalLayers::kReference, TemporalLayers::kReference, | 236 TemporalLayers::kReference, TemporalLayers::kReference, |
212 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), | 237 TemporalLayers::kReference, TemporalLayers::kFreezeEntropy), |
213 TemporalLayers::FrameConfig(TemporalLayers::kReference, | 238 TemporalLayers::FrameConfig(TemporalLayers::kReference, |
214 TemporalLayers::kReference, | 239 TemporalLayers::kReference, |
215 TemporalLayers::kReferenceAndUpdate), | 240 TemporalLayers::kReferenceAndUpdate), |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
386 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers)) | 411 if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers)) |
387 listener_->OnTemporalLayersCreated(simulcast_id, tl); | 412 listener_->OnTemporalLayersCreated(simulcast_id, tl); |
388 return tl; | 413 return tl; |
389 } | 414 } |
390 | 415 |
391 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { | 416 void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) { |
392 listener_ = listener; | 417 listener_ = listener; |
393 } | 418 } |
394 | 419 |
395 } // namespace webrtc | 420 } // namespace webrtc |
OLD | NEW |