OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <cstring> | 11 #include <cstring> |
12 #include <limits> | 12 #include <limits> |
13 #include <utility> | |
13 | 14 |
14 #include "webrtc/modules/video_coding/frame_object.h" | 15 #include "webrtc/modules/video_coding/frame_object.h" |
15 #include "webrtc/modules/video_coding/packet_buffer.h" | 16 #include "webrtc/modules/video_coding/packet_buffer.h" |
16 | 17 |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "webrtc/base/random.h" | 19 #include "webrtc/base/random.h" |
19 | 20 |
20 namespace webrtc { | 21 namespace webrtc { |
21 namespace video_coding { | 22 namespace video_coding { |
22 | 23 |
23 class TestPacketBuffer : public ::testing::Test, | 24 class TestPacketBuffer : public ::testing::Test, |
24 public OnCompleteFrameCallback { | 25 public OnCompleteFrameCallback { |
25 protected: | 26 protected: |
26 TestPacketBuffer() | 27 TestPacketBuffer() |
27 : rand_(0x8739211), | 28 : rand_(0x8739211), |
28 packet_buffer_(new PacketBuffer(kStartSize, kMaxSize, this)) {} | 29 packet_buffer_(new PacketBuffer(kStartSize, kMaxSize, this)), |
30 frames_from_callback_(FrameComp()) {} | |
29 | 31 |
30 uint16_t Rand() { return rand_.Rand(std::numeric_limits<uint16_t>::max()); } | 32 uint16_t Rand() { return rand_.Rand(std::numeric_limits<uint16_t>::max()); } |
31 | 33 |
32 void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override { | 34 void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override { |
33 uint16_t pid = frame->picture_id; | 35 uint16_t pid = frame->picture_id; |
34 auto frame_it = frames_from_callback_.find(pid); | 36 uint16_t sidx = frame->spatial_layer; |
37 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx)); | |
35 if (frame_it != frames_from_callback_.end()) { | 38 if (frame_it != frames_from_callback_.end()) { |
36 ADD_FAILURE() << "Already received frame with picture id: " << pid; | 39 ADD_FAILURE() << "Already received frame with (pid:sidx): (" |
40 << pid << ":" << sidx << ")"; | |
37 return; | 41 return; |
38 } | 42 } |
39 | 43 |
40 frames_from_callback_.insert( | 44 frames_from_callback_.insert( |
41 make_pair(frame->picture_id, std::move(frame))); | 45 std::make_pair(std::make_pair(pid, sidx), std::move(frame))); |
42 } | 46 } |
43 | 47 |
44 void TearDown() override { | 48 void TearDown() override { |
45 // All frame objects must be destroyed before the packet buffer since | 49 // All frame objects must be destroyed before the packet buffer since |
46 // a frame object will try to remove itself from the packet buffer | 50 // a frame object will try to remove itself from the packet buffer |
47 // upon destruction. | 51 // upon destruction. |
48 frames_from_callback_.clear(); | 52 frames_from_callback_.clear(); |
49 } | 53 } |
50 | 54 |
55 // Short version of true and false. | |
56 enum { | |
57 kT = true, | |
58 kF = false | |
59 }; | |
stefan-webrtc
2016/04/26 08:15:12
Not a big fan of this, I don't think it makes the
philipel
2016/04/28 09:40:42
I agree it's somewhat hacky, but the problem is if
stefan-webrtc
2016/05/04 09:09:50
Not sure it's worth to keep that then, sooner or l
| |
60 | |
51 // Insert a generic packet into the packet buffer. | 61 // Insert a generic packet into the packet buffer. |
52 void InsertGeneric(uint16_t seq_num, // packet sequence number | 62 void InsertGeneric(uint16_t seq_num, // packet sequence number |
53 bool keyframe, // is keyframe | 63 bool keyframe, // is keyframe |
54 bool first, // is first packet of frame | 64 bool first, // is first packet of frame |
55 bool last, // is last packet of frame | 65 bool last, // is last packet of frame |
56 size_t data_size = 0, // size of data | 66 size_t data_size = 0, // size of data |
57 uint8_t* data = nullptr) { // data pointer | 67 uint8_t* data = nullptr) { // data pointer |
58 VCMPacket packet; | 68 VCMPacket packet; |
59 packet.codec = kVideoCodecGeneric; | 69 packet.codec = kVideoCodecGeneric; |
60 packet.seqNum = seq_num; | 70 packet.seqNum = seq_num; |
(...skipping 26 matching lines...) Expand all Loading... | |
87 packet.sizeBytes = data_size; | 97 packet.sizeBytes = data_size; |
88 packet.dataPtr = data; | 98 packet.dataPtr = data; |
89 packet.codecSpecificHeader.codecHeader.VP8.pictureId = pid % (1 << 15); | 99 packet.codecSpecificHeader.codecHeader.VP8.pictureId = pid % (1 << 15); |
90 packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = tid; | 100 packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = tid; |
91 packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = tl0; | 101 packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = tl0; |
92 packet.codecSpecificHeader.codecHeader.VP8.layerSync = sync; | 102 packet.codecSpecificHeader.codecHeader.VP8.layerSync = sync; |
93 | 103 |
94 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 104 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
95 } | 105 } |
96 | 106 |
97 // Check if a frame with picture id |pid| has been delivered from the packet | 107 // Insert a Vp9 packet into the packet buffer. |
98 // buffer, and if so, if it has the references specified by |refs|. | 108 void InsertVp9Gof(uint16_t seq_num, // packet sequence number |
109 bool keyframe, // is keyframe | |
110 bool first, // is first packet of frame | |
111 bool last, // is last packet of frame | |
112 bool up = false, // frame is up-switch point | |
113 int32_t pid = kNoPictureId, // picture id | |
114 uint8_t sid = kNoSpatialIdx, // spatial id | |
115 uint8_t tid = kNoTemporalIdx, // temporal id | |
116 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index | |
117 GofInfoVP9* ss = nullptr, // scalability structure | |
118 size_t data_size = 0, // size of data | |
119 uint8_t* data = nullptr) { // data pointer | |
120 VCMPacket packet; | |
121 packet.codec = kVideoCodecVP9; | |
122 packet.seqNum = seq_num; | |
123 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | |
124 packet.isFirstPacket = first; | |
125 packet.markerBit = last; | |
126 packet.sizeBytes = data_size; | |
127 packet.dataPtr = data; | |
128 packet.codecSpecificHeader.codecHeader.VP9.flexible_mode = false; | |
129 packet.codecSpecificHeader.codecHeader.VP9.picture_id = pid % (1 << 15); | |
130 packet.codecSpecificHeader.codecHeader.VP9.temporal_idx = tid; | |
131 packet.codecSpecificHeader.codecHeader.VP9.spatial_idx = sid; | |
132 packet.codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = tl0; | |
133 packet.codecSpecificHeader.codecHeader.VP9.temporal_up_switch = up; | |
134 if (ss != nullptr) { | |
135 packet.codecSpecificHeader.codecHeader.VP9.ss_data_available = true; | |
136 packet.codecSpecificHeader.codecHeader.VP9.gof = *ss; | |
137 } | |
138 | |
139 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | |
140 } | |
141 | |
142 // Insert a Vp9 packet into the packet buffer. | |
143 void InsertVp9Flex(uint16_t seq_num, // packet sequence number | |
144 bool keyframe, // is keyframe | |
145 bool first, // is first packet of frame | |
146 bool last, // is last packet of frame | |
147 bool inter, // depends on S-1 layer | |
148 int32_t pid = kNoPictureId, // picture id | |
149 uint8_t sid = kNoSpatialIdx, // spatial id | |
150 uint8_t tid = kNoTemporalIdx, // temporal id | |
151 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index | |
152 std::vector<uint8_t> refs = | |
153 std::vector<uint8_t>(), // frame references | |
154 size_t data_size = 0, // size of data | |
155 uint8_t* data = nullptr) { // data pointer | |
156 VCMPacket packet; | |
157 packet.codec = kVideoCodecVP9; | |
158 packet.seqNum = seq_num; | |
159 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | |
160 packet.isFirstPacket = first; | |
161 packet.markerBit = last; | |
162 packet.sizeBytes = data_size; | |
163 packet.dataPtr = data; | |
164 packet.codecSpecificHeader.codecHeader.VP9.inter_layer_predicted = inter; | |
165 packet.codecSpecificHeader.codecHeader.VP9.flexible_mode = true; | |
166 packet.codecSpecificHeader.codecHeader.VP9.picture_id = pid % (1 << 15); | |
167 packet.codecSpecificHeader.codecHeader.VP9.temporal_idx = tid; | |
168 packet.codecSpecificHeader.codecHeader.VP9.spatial_idx = sid; | |
169 packet.codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = tl0; | |
170 packet.codecSpecificHeader.codecHeader.VP9.num_ref_pics = refs.size(); | |
171 for (size_t i = 0; i < refs.size(); ++i) | |
172 packet.codecSpecificHeader.codecHeader.VP9.pid_diff[i] = refs[i]; | |
173 | |
174 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | |
175 } | |
176 | |
177 // Check if a frame with picture id |pid| and spatial index |sidx| has been | |
178 // delivered from the packet buffer, and if so, if it has the references | |
179 // specified by |refs|. | |
99 template <typename... T> | 180 template <typename... T> |
100 void CheckReferences(uint16_t pid, T... refs) const { | 181 void CheckReferences(uint16_t pid, uint16_t sidx, T... refs) const { |
101 auto frame_it = frames_from_callback_.find(pid); | 182 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx)); |
102 if (frame_it == frames_from_callback_.end()) { | 183 if (frame_it == frames_from_callback_.end()) { |
103 ADD_FAILURE() << "Could not find frame with picture id " << pid; | 184 ADD_FAILURE() << "Could not find frame with (pid:sidx): (" |
185 << pid << ":" << sidx << ")"; | |
104 return; | 186 return; |
105 } | 187 } |
106 | 188 |
107 std::set<uint16_t> actual_refs; | 189 std::set<uint16_t> actual_refs; |
108 for (uint8_t r = 0; r < frame_it->second->num_references; ++r) { | 190 for (uint8_t r = 0; r < frame_it->second->num_references; ++r) { |
109 actual_refs.insert(frame_it->second->references[r]); | 191 actual_refs.insert(frame_it->second->references[r]); |
110 } | 192 } |
111 | 193 |
112 std::set<uint16_t> expected_refs; | 194 std::set<uint16_t> expected_refs; |
113 RefsToSet(&expected_refs, refs...); | 195 RefsToSet(&expected_refs, refs...); |
114 | 196 |
115 ASSERT_EQ(expected_refs, actual_refs); | 197 ASSERT_EQ(expected_refs, actual_refs); |
116 } | 198 } |
117 | 199 |
118 template <typename... T> | 200 template <typename... T> |
201 void CheckReferencesGeneric(uint16_t pid, T... refs) const { | |
202 CheckReferences(pid, 0, refs...); | |
203 } | |
204 | |
205 template <typename... T> | |
206 void CheckReferencesVp8(uint16_t pid, T... refs) const { | |
207 CheckReferences(pid, 0, refs...); | |
208 } | |
209 | |
210 template <typename... T> | |
211 void CheckReferencesVp9(uint16_t pid, uint8_t sidx, T... refs) const { | |
212 CheckReferences(pid, sidx, refs...); | |
213 } | |
214 | |
215 template <typename... T> | |
119 void RefsToSet(std::set<uint16_t>* m, uint16_t ref, T... refs) const { | 216 void RefsToSet(std::set<uint16_t>* m, uint16_t ref, T... refs) const { |
120 m->insert(ref); | 217 m->insert(ref); |
121 RefsToSet(m, refs...); | 218 RefsToSet(m, refs...); |
122 } | 219 } |
123 | 220 |
124 void RefsToSet(std::set<uint16_t>* m) const {} | 221 void RefsToSet(std::set<uint16_t>* m) const {} |
125 | 222 |
126 const int kStartSize = 16; | 223 const int kStartSize = 16; |
127 const int kMaxSize = 64; | 224 const int kMaxSize = 64; |
128 | 225 |
129 Random rand_; | 226 Random rand_; |
130 std::unique_ptr<PacketBuffer> packet_buffer_; | 227 std::unique_ptr<PacketBuffer> packet_buffer_; |
131 std::map<uint16_t, std::unique_ptr<FrameObject>> frames_from_callback_; | 228 struct FrameComp { |
229 bool operator()(const std::pair<uint16_t, uint8_t> f1, | |
230 const std::pair<uint16_t, uint8_t> f2) const { | |
231 if (f1.first == f2.first) | |
232 return f1.second < f2.second; | |
233 return f1.first < f2.first; | |
234 } | |
235 }; | |
236 std::map<std::pair<uint16_t, uint8_t>, | |
237 std::unique_ptr<FrameObject>, | |
238 FrameComp> frames_from_callback_; | |
132 }; | 239 }; |
133 | 240 |
134 TEST_F(TestPacketBuffer, InsertOnePacket) { | 241 TEST_F(TestPacketBuffer, InsertOnePacket) { |
135 VCMPacket packet; | 242 VCMPacket packet; |
136 packet.seqNum = Rand(); | 243 packet.seqNum = Rand(); |
137 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 244 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
138 } | 245 } |
139 | 246 |
140 TEST_F(TestPacketBuffer, InsertMultiplePackets) { | 247 TEST_F(TestPacketBuffer, InsertMultiplePackets) { |
141 VCMPacket packet; | 248 VCMPacket packet; |
(...skipping 11 matching lines...) Expand all Loading... | |
153 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 260 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
154 ++packet.seqNum; | 261 ++packet.seqNum; |
155 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 262 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
156 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 263 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
157 } | 264 } |
158 | 265 |
159 TEST_F(TestPacketBuffer, ExpandBuffer) { | 266 TEST_F(TestPacketBuffer, ExpandBuffer) { |
160 uint16_t seq_num = Rand(); | 267 uint16_t seq_num = Rand(); |
161 | 268 |
162 for (int i = 0; i < kStartSize + 1; ++i) { | 269 for (int i = 0; i < kStartSize + 1; ++i) { |
163 // seq_num , keyframe, first, last | 270 // seq_num , kf, frst, lst |
164 InsertGeneric(seq_num + i, true , true , true); | 271 InsertGeneric(seq_num + i, kT , kT, kT); |
165 } | 272 } |
166 } | 273 } |
167 | 274 |
168 TEST_F(TestPacketBuffer, ExpandBufferOverflow) { | 275 TEST_F(TestPacketBuffer, ExpandBufferOverflow) { |
169 uint16_t seq_num = Rand(); | 276 uint16_t seq_num = Rand(); |
170 | 277 |
171 for (int i = 0; i < kMaxSize; ++i) { | 278 for (int i = 0; i < kMaxSize; ++i) { |
172 // seq_num , keyframe, first, last | 279 // seq_num , kf, frst, lst |
173 InsertGeneric(seq_num + i, true , true , true); | 280 InsertGeneric(seq_num + i, kT, kT , kT); |
174 } | 281 } |
175 | 282 |
176 VCMPacket packet; | 283 VCMPacket packet; |
177 packet.seqNum = seq_num + kMaxSize + 1; | 284 packet.seqNum = seq_num + kMaxSize + 1; |
178 packet.sizeBytes = 1; | 285 packet.sizeBytes = 1; |
179 EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); | 286 EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); |
180 } | 287 } |
181 | 288 |
182 TEST_F(TestPacketBuffer, GenericOnePacketOneFrame) { | 289 TEST_F(TestPacketBuffer, GenericOnePacketOneFrame) { |
183 // seq_num, keyframe, first, last | 290 // seq_num, kf, frst, lst |
184 InsertGeneric(Rand() , true , true , true); | 291 InsertGeneric(Rand() , kT, kT , kT); |
185 ASSERT_EQ(1UL, frames_from_callback_.size()); | 292 ASSERT_EQ(1UL, frames_from_callback_.size()); |
186 } | 293 } |
187 | 294 |
188 TEST_F(TestPacketBuffer, GenericTwoPacketsTwoFrames) { | 295 TEST_F(TestPacketBuffer, GenericTwoPacketsTwoFrames) { |
189 uint16_t seq_num = Rand(); | 296 uint16_t seq_num = Rand(); |
190 | 297 |
191 // seq_num , keyframe, first, last | 298 // seq_num , kf, frst, lst |
192 InsertGeneric(seq_num , true , true , true); | 299 InsertGeneric(seq_num , kT, kT , kT); |
193 InsertGeneric(seq_num + 1, true , true , true); | 300 InsertGeneric(seq_num + 1, kT, kT , kT); |
194 | 301 |
195 EXPECT_EQ(2UL, frames_from_callback_.size()); | 302 EXPECT_EQ(2UL, frames_from_callback_.size()); |
196 } | 303 } |
197 | 304 |
198 TEST_F(TestPacketBuffer, GenericTwoPacketsOneFrames) { | 305 TEST_F(TestPacketBuffer, GenericTwoPacketsOneFrames) { |
199 uint16_t seq_num = Rand(); | 306 uint16_t seq_num = Rand(); |
200 | 307 |
201 // seq_num , keyframe, first, last | 308 // seq_num , kf, frst, lst |
202 InsertGeneric(seq_num , true , true , false); | 309 InsertGeneric(seq_num , kT, kT , kF); |
203 InsertGeneric(seq_num + 1, true , false, true); | 310 InsertGeneric(seq_num + 1, kT, kF , kT); |
204 | 311 |
205 EXPECT_EQ(1UL, frames_from_callback_.size()); | 312 EXPECT_EQ(1UL, frames_from_callback_.size()); |
206 } | 313 } |
207 | 314 |
208 TEST_F(TestPacketBuffer, GenericThreePacketReorderingOneFrame) { | 315 TEST_F(TestPacketBuffer, GenericThreePacketReorderingOneFrame) { |
209 uint16_t seq_num = Rand(); | 316 uint16_t seq_num = Rand(); |
210 | 317 |
211 // seq_num , keyframe, first, last | 318 // seq_num , kf, frst, lst |
212 InsertGeneric(seq_num , true , true , false); | 319 InsertGeneric(seq_num , kT, kT , kF); |
213 InsertGeneric(seq_num + 2, true , false, true); | 320 InsertGeneric(seq_num + 2, kT, kF , kT); |
214 InsertGeneric(seq_num + 1, true , false, false); | 321 InsertGeneric(seq_num + 1, kT, kF , kF); |
215 | 322 |
216 EXPECT_EQ(1UL, frames_from_callback_.size()); | 323 EXPECT_EQ(1UL, frames_from_callback_.size()); |
217 } | 324 } |
218 | 325 |
219 TEST_F(TestPacketBuffer, DiscardOldPacket) { | 326 TEST_F(TestPacketBuffer, DiscardOldPacket) { |
220 uint16_t seq_num = Rand(); | 327 uint16_t seq_num = Rand(); |
221 VCMPacket packet; | 328 VCMPacket packet; |
222 packet.seqNum = Rand(); | 329 packet.seqNum = Rand(); |
223 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 330 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
224 packet.seqNum += 2; | 331 packet.seqNum += 2; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
262 TEST_F(TestPacketBuffer, GenericFrames) { | 369 TEST_F(TestPacketBuffer, GenericFrames) { |
263 uint16_t seq_num = Rand(); | 370 uint16_t seq_num = Rand(); |
264 | 371 |
265 // seq_num , keyf , first, last | 372 // seq_num , keyf , first, last |
266 InsertGeneric(seq_num , true , true , true); | 373 InsertGeneric(seq_num , true , true , true); |
267 InsertGeneric(seq_num + 1, false, true , true); | 374 InsertGeneric(seq_num + 1, false, true , true); |
268 InsertGeneric(seq_num + 2, false, true , true); | 375 InsertGeneric(seq_num + 2, false, true , true); |
269 InsertGeneric(seq_num + 3, false, true , true); | 376 InsertGeneric(seq_num + 3, false, true , true); |
270 | 377 |
271 ASSERT_EQ(4UL, frames_from_callback_.size()); | 378 ASSERT_EQ(4UL, frames_from_callback_.size()); |
272 CheckReferences(seq_num); | 379 CheckReferencesGeneric(seq_num); |
273 CheckReferences(seq_num + 1, seq_num); | 380 CheckReferencesGeneric(seq_num + 1, seq_num); |
274 CheckReferences(seq_num + 2, seq_num + 1); | 381 CheckReferencesGeneric(seq_num + 2, seq_num + 1); |
275 CheckReferences(seq_num + 3, seq_num + 2); | 382 CheckReferencesGeneric(seq_num + 3, seq_num + 2); |
276 } | 383 } |
277 | 384 |
278 TEST_F(TestPacketBuffer, GenericFramesReordered) { | 385 TEST_F(TestPacketBuffer, GenericFramesReordered) { |
279 uint16_t seq_num = Rand(); | 386 uint16_t seq_num = Rand(); |
280 | 387 |
281 // seq_num , keyf , first, last | 388 // seq_num , keyf , first, last |
282 InsertGeneric(seq_num + 1, false, true , true); | 389 InsertGeneric(seq_num + 1, false, true , true); |
283 InsertGeneric(seq_num , true , true , true); | 390 InsertGeneric(seq_num , true , true , true); |
284 InsertGeneric(seq_num + 3, false, true , true); | 391 InsertGeneric(seq_num + 3, false, true , true); |
285 InsertGeneric(seq_num + 2, false, true , true); | 392 InsertGeneric(seq_num + 2, false, true , true); |
286 | 393 |
287 ASSERT_EQ(4UL, frames_from_callback_.size()); | 394 ASSERT_EQ(4UL, frames_from_callback_.size()); |
288 CheckReferences(seq_num); | 395 CheckReferencesGeneric(seq_num); |
289 CheckReferences(seq_num + 1, seq_num); | 396 CheckReferencesGeneric(seq_num + 1, seq_num); |
290 CheckReferences(seq_num + 2, seq_num + 1); | 397 CheckReferencesGeneric(seq_num + 2, seq_num + 1); |
291 CheckReferences(seq_num + 3, seq_num + 2); | 398 CheckReferencesGeneric(seq_num + 3, seq_num + 2); |
292 } | 399 } |
293 | 400 |
294 TEST_F(TestPacketBuffer, GetBitstreamFromFrame) { | 401 TEST_F(TestPacketBuffer, GetBitstreamFromFrame) { |
295 // "many bitstream, such data" with null termination. | 402 // "many bitstream, such data" with null termination. |
296 uint8_t many[] = {0x6d, 0x61, 0x6e, 0x79, 0x20}; | 403 uint8_t many[] = {0x6d, 0x61, 0x6e, 0x79, 0x20}; |
297 uint8_t bitstream[] = {0x62, 0x69, 0x74, 0x73, 0x74, 0x72, | 404 uint8_t bitstream[] = {0x62, 0x69, 0x74, 0x73, 0x74, 0x72, |
298 0x65, 0x61, 0x6d, 0x2c, 0x20}; | 405 0x65, 0x61, 0x6d, 0x2c, 0x20}; |
299 uint8_t such[] = {0x73, 0x75, 0x63, 0x68, 0x20}; | 406 uint8_t such[] = {0x73, 0x75, 0x63, 0x68, 0x20}; |
300 uint8_t data[] = {0x64, 0x61, 0x74, 0x61, 0x0}; | 407 uint8_t data[] = {0x64, 0x61, 0x74, 0x61, 0x0}; |
301 uint8_t | 408 uint8_t |
302 result[sizeof(many) + sizeof(bitstream) + sizeof(such) + sizeof(data)]; | 409 result[sizeof(many) + sizeof(bitstream) + sizeof(such) + sizeof(data)]; |
303 | 410 |
304 uint16_t seq_num = Rand(); | 411 uint16_t seq_num = Rand(); |
305 | 412 |
306 // seq_num , keyf , first, last , data_size , data | 413 // seq_num , kf, frst, lst, data_size , data |
307 InsertGeneric(seq_num , true , true , false, sizeof(many) , many); | 414 InsertGeneric(seq_num , kT, kT , kF , sizeof(many) , many); |
308 InsertGeneric(seq_num + 1, false, false, false, sizeof(bitstream), bitstream); | 415 InsertGeneric(seq_num + 1, kF, kF , kF , sizeof(bitstream), bitstream); |
309 InsertGeneric(seq_num + 2, false, false, false, sizeof(such) , such); | 416 InsertGeneric(seq_num + 2, kF, kF , kF , sizeof(such) , such); |
310 InsertGeneric(seq_num + 3, false, false, true , sizeof(data) , data); | 417 InsertGeneric(seq_num + 3, kF, kF , kT , sizeof(data) , data); |
311 | 418 |
312 ASSERT_EQ(1UL, frames_from_callback_.size()); | 419 ASSERT_EQ(1UL, frames_from_callback_.size()); |
313 CheckReferences(seq_num + 3); | 420 CheckReferencesVp8(seq_num + 3); |
314 EXPECT_TRUE(frames_from_callback_[seq_num + 3]->GetBitstream(result)); | 421 EXPECT_TRUE(frames_from_callback_[std::make_pair(seq_num + 3, 0)]-> |
422 GetBitstream(result)); | |
315 EXPECT_EQ(std::strcmp("many bitstream, such data", | 423 EXPECT_EQ(std::strcmp("many bitstream, such data", |
316 reinterpret_cast<char*>(result)), | 424 reinterpret_cast<char*>(result)), |
317 0); | 425 0); |
318 } | 426 } |
319 | 427 |
320 TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) { | 428 TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) { |
321 uint16_t seq_num = Rand(); | 429 uint16_t seq_num = Rand(); |
322 | 430 |
323 // seq_num , keyf , first, last | 431 // seq_num , kf, frst, lst |
324 InsertGeneric(seq_num , true , true , false); | 432 InsertGeneric(seq_num , kT, kT , kF); |
325 InsertGeneric(seq_num + 1, false, false, false); | 433 InsertGeneric(seq_num + 1, kF, kF , kF); |
326 InsertGeneric(seq_num + 2, false, false, true); | 434 InsertGeneric(seq_num + 2, kF, kF , kT); |
327 EXPECT_EQ(1UL, frames_from_callback_.size()); | 435 EXPECT_EQ(1UL, frames_from_callback_.size()); |
328 | 436 |
329 frames_from_callback_.clear(); | 437 frames_from_callback_.clear(); |
330 | 438 |
331 // seq_num , keyf , first, last | 439 // seq_num , kf, frst, lst |
332 InsertGeneric(seq_num , true , true , false); | 440 InsertGeneric(seq_num , kT, kT , kF); |
333 InsertGeneric(seq_num + 1, false, false, false); | 441 InsertGeneric(seq_num + 1, kF, kF , kF); |
334 InsertGeneric(seq_num + 2, false, false, true); | 442 InsertGeneric(seq_num + 2, kF, kF , kT); |
335 EXPECT_EQ(1UL, frames_from_callback_.size()); | 443 EXPECT_EQ(1UL, frames_from_callback_.size()); |
336 } | 444 } |
337 | 445 |
338 TEST_F(TestPacketBuffer, Flush) { | 446 TEST_F(TestPacketBuffer, Flush) { |
339 uint16_t seq_num = Rand(); | 447 uint16_t seq_num = Rand(); |
340 | 448 |
341 // seq_num , keyf , first, last | 449 // seq_num , kf, frst, lst |
342 InsertGeneric(seq_num , true , true , false); | 450 InsertGeneric(seq_num , kT, kT , kF); |
343 InsertGeneric(seq_num + 1, false, false, false); | 451 InsertGeneric(seq_num + 1, kF, kF , kF); |
344 InsertGeneric(seq_num + 2, false, false, true); | 452 InsertGeneric(seq_num + 2, kF, kF , kT); |
345 EXPECT_EQ(1UL, frames_from_callback_.size()); | 453 EXPECT_EQ(1UL, frames_from_callback_.size()); |
346 | 454 |
347 packet_buffer_->Flush(); | 455 packet_buffer_->Flush(); |
348 | 456 |
349 // seq_num , keyf , first, last | 457 // seq_num , kf, frst, lst |
350 InsertGeneric(seq_num + kStartSize , true , true , false); | 458 InsertGeneric(seq_num + kStartSize , kT, kT , kF); |
351 InsertGeneric(seq_num + kStartSize + 1, false, false, false); | 459 InsertGeneric(seq_num + kStartSize + 1, kF, kF , kF); |
352 InsertGeneric(seq_num + kStartSize + 2, false, false, true); | 460 InsertGeneric(seq_num + kStartSize + 2, kF, kF , kT); |
353 EXPECT_EQ(2UL, frames_from_callback_.size()); | 461 EXPECT_EQ(2UL, frames_from_callback_.size()); |
354 } | 462 } |
355 | 463 |
356 TEST_F(TestPacketBuffer, InvalidateFrameByFlushing) { | 464 TEST_F(TestPacketBuffer, InvalidateFrameByFlushing) { |
357 VCMPacket packet; | 465 VCMPacket packet; |
358 packet.codec = kVideoCodecGeneric; | 466 packet.codec = kVideoCodecGeneric; |
359 packet.frameType = kVideoFrameKey; | 467 packet.frameType = kVideoFrameKey; |
360 packet.isFirstPacket = true; | 468 packet.isFirstPacket = kT; |
361 packet.markerBit = true; | 469 packet.markerBit = kT; |
362 packet.seqNum = Rand(); | 470 packet.seqNum = Rand(); |
363 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 471 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
364 ASSERT_EQ(1UL, frames_from_callback_.size()); | 472 ASSERT_EQ(1UL, frames_from_callback_.size()); |
365 | 473 |
366 packet_buffer_->Flush(); | 474 packet_buffer_->Flush(); |
367 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr)); | 475 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr)); |
368 } | 476 } |
369 | 477 |
370 TEST_F(TestPacketBuffer, Vp8NoPictureId) { | 478 TEST_F(TestPacketBuffer, Vp8NoPictureId) { |
371 uint16_t seq_num = Rand(); | 479 uint16_t seq_num = Rand(); |
372 | 480 |
373 // seq_num , keyf , first, last | 481 // seq_num , kf, frst, lst |
374 InsertVp8(seq_num , true , true , false); | 482 InsertVp8(seq_num , kT, kT , kF); |
375 InsertVp8(seq_num + 1 , false, false, false); | 483 InsertVp8(seq_num + 1 , kF, kF , kF); |
376 InsertVp8(seq_num + 2 , false, false, true); | 484 InsertVp8(seq_num + 2 , kF, kF , kT); |
377 ASSERT_EQ(1UL, frames_from_callback_.size()); | 485 ASSERT_EQ(1UL, frames_from_callback_.size()); |
378 | 486 |
379 InsertVp8(seq_num + 3 , false, true , false); | 487 InsertVp8(seq_num + 3 , kF, kT , kF); |
380 InsertVp8(seq_num + 4 , false, false, true); | 488 InsertVp8(seq_num + 4 , kF, kF , kT); |
381 ASSERT_EQ(2UL, frames_from_callback_.size()); | 489 ASSERT_EQ(2UL, frames_from_callback_.size()); |
382 | 490 |
383 InsertVp8(seq_num + 5 , false, true , false); | 491 InsertVp8(seq_num + 5 , kF, kT , kF); |
384 InsertVp8(seq_num + 6 , false, false, false); | 492 InsertVp8(seq_num + 6 , kF, kF , kF); |
385 InsertVp8(seq_num + 7 , false, false, false); | 493 InsertVp8(seq_num + 7 , kF, kF , kF); |
386 InsertVp8(seq_num + 8 , false, false, true); | 494 InsertVp8(seq_num + 8 , kF, kF , kT); |
387 ASSERT_EQ(3UL, frames_from_callback_.size()); | 495 ASSERT_EQ(3UL, frames_from_callback_.size()); |
388 | 496 |
389 InsertVp8(seq_num + 9 , false, true , true); | 497 InsertVp8(seq_num + 9 , kF, kT , kT); |
390 ASSERT_EQ(4UL, frames_from_callback_.size()); | 498 ASSERT_EQ(4UL, frames_from_callback_.size()); |
391 | 499 |
392 InsertVp8(seq_num + 10, false, true , false); | 500 InsertVp8(seq_num + 10, kF, kT , kF); |
393 InsertVp8(seq_num + 11, false, false, true); | 501 InsertVp8(seq_num + 11, kF, kF , kT); |
394 ASSERT_EQ(5UL, frames_from_callback_.size()); | 502 ASSERT_EQ(5UL, frames_from_callback_.size()); |
395 | 503 |
396 InsertVp8(seq_num + 12, true , true , true); | 504 InsertVp8(seq_num + 12, kT, kT , kT); |
397 ASSERT_EQ(6UL, frames_from_callback_.size()); | 505 ASSERT_EQ(6UL, frames_from_callback_.size()); |
398 | 506 |
399 InsertVp8(seq_num + 13, false, true , false); | 507 InsertVp8(seq_num + 13, kF, kT , kF); |
400 InsertVp8(seq_num + 14, false, false, false); | 508 InsertVp8(seq_num + 14, kF, kF , kF); |
401 InsertVp8(seq_num + 15, false, false, false); | 509 InsertVp8(seq_num + 15, kF, kF , kF); |
402 InsertVp8(seq_num + 16, false, false, false); | 510 InsertVp8(seq_num + 16, kF, kF , kF); |
403 InsertVp8(seq_num + 17, false, false, true); | 511 InsertVp8(seq_num + 17, kF, kF , kT); |
404 ASSERT_EQ(7UL, frames_from_callback_.size()); | 512 ASSERT_EQ(7UL, frames_from_callback_.size()); |
405 | 513 |
406 InsertVp8(seq_num + 18, false, true , true); | 514 InsertVp8(seq_num + 18, kF, kT , kT); |
407 ASSERT_EQ(8UL, frames_from_callback_.size()); | 515 ASSERT_EQ(8UL, frames_from_callback_.size()); |
408 | 516 |
409 InsertVp8(seq_num + 19, false, true , false); | 517 InsertVp8(seq_num + 19, kF, kT , kF); |
410 InsertVp8(seq_num + 20, false, false, true); | 518 InsertVp8(seq_num + 20, kF, kF , kT); |
411 ASSERT_EQ(9UL, frames_from_callback_.size()); | 519 ASSERT_EQ(9UL, frames_from_callback_.size()); |
412 | 520 |
413 InsertVp8(seq_num + 21, false, true , true); | 521 InsertVp8(seq_num + 21, kF, kT , kT); |
414 | 522 |
415 ASSERT_EQ(10UL, frames_from_callback_.size()); | 523 ASSERT_EQ(10UL, frames_from_callback_.size()); |
416 CheckReferences(seq_num + 2); | 524 CheckReferencesVp8(seq_num + 2); |
417 CheckReferences(seq_num + 4, seq_num + 2); | 525 CheckReferencesVp8(seq_num + 4, seq_num + 2); |
418 CheckReferences(seq_num + 8, seq_num + 4); | 526 CheckReferencesVp8(seq_num + 8, seq_num + 4); |
419 CheckReferences(seq_num + 9, seq_num + 8); | 527 CheckReferencesVp8(seq_num + 9, seq_num + 8); |
420 CheckReferences(seq_num + 11, seq_num + 9); | 528 CheckReferencesVp8(seq_num + 11, seq_num + 9); |
421 CheckReferences(seq_num + 12); | 529 CheckReferencesVp8(seq_num + 12); |
422 CheckReferences(seq_num + 17, seq_num + 12); | 530 CheckReferencesVp8(seq_num + 17, seq_num + 12); |
423 CheckReferences(seq_num + 18, seq_num + 17); | 531 CheckReferencesVp8(seq_num + 18, seq_num + 17); |
424 CheckReferences(seq_num + 20, seq_num + 18); | 532 CheckReferencesVp8(seq_num + 20, seq_num + 18); |
425 CheckReferences(seq_num + 21, seq_num + 20); | 533 CheckReferencesVp8(seq_num + 21, seq_num + 20); |
426 } | 534 } |
427 | 535 |
428 TEST_F(TestPacketBuffer, Vp8NoPictureIdReordered) { | 536 TEST_F(TestPacketBuffer, Vp8NoPictureIdReordered) { |
429 uint16_t seq_num = 0xfffa; | 537 uint16_t seq_num = 0xfffa; |
430 | 538 |
431 // seq_num , keyf , first, last | 539 // seq_num , kf, frst, lst |
432 InsertVp8(seq_num + 1 , false, false, false); | 540 InsertVp8(seq_num + 1 , kF, kF , kF); |
433 InsertVp8(seq_num , true , true , false); | 541 InsertVp8(seq_num , kT, kT , kF); |
434 InsertVp8(seq_num + 2 , false, false, true); | 542 InsertVp8(seq_num + 2 , kF, kF , kT); |
435 InsertVp8(seq_num + 4 , false, false, true); | 543 InsertVp8(seq_num + 4 , kF, kF , kT); |
436 InsertVp8(seq_num + 6 , false, false, false); | 544 InsertVp8(seq_num + 6 , kF, kF , kF); |
437 InsertVp8(seq_num + 3 , false, true , false); | 545 InsertVp8(seq_num + 3 , kF, kT , kF); |
438 InsertVp8(seq_num + 7 , false, false, false); | 546 InsertVp8(seq_num + 7 , kF, kF , kF); |
439 InsertVp8(seq_num + 5 , false, true , false); | 547 InsertVp8(seq_num + 5 , kF, kT , kF); |
440 InsertVp8(seq_num + 9 , false, true , true); | 548 InsertVp8(seq_num + 9 , kF, kT , kT); |
441 InsertVp8(seq_num + 10, false, true , false); | 549 InsertVp8(seq_num + 10, kF, kT , kF); |
442 InsertVp8(seq_num + 8 , false, false, true); | 550 InsertVp8(seq_num + 8 , kF, kF , kT); |
443 InsertVp8(seq_num + 13, false, true , false); | 551 InsertVp8(seq_num + 13, kF, kT , kF); |
444 InsertVp8(seq_num + 14, false, false, false); | 552 InsertVp8(seq_num + 14, kF, kF , kF); |
445 InsertVp8(seq_num + 12, true , true , true); | 553 InsertVp8(seq_num + 12, kT, kT , kT); |
446 InsertVp8(seq_num + 11, false, false, true); | 554 InsertVp8(seq_num + 11, kF, kF , kT); |
447 InsertVp8(seq_num + 16, false, false, false); | 555 InsertVp8(seq_num + 16, kF, kF , kF); |
448 InsertVp8(seq_num + 19, false, true , false); | 556 InsertVp8(seq_num + 19, kF, kT , kF); |
449 InsertVp8(seq_num + 15, false, false, false); | 557 InsertVp8(seq_num + 15, kF, kF , kF); |
450 InsertVp8(seq_num + 17, false, false, true); | 558 InsertVp8(seq_num + 17, kF, kF , kT); |
451 InsertVp8(seq_num + 20, false, false, true); | 559 InsertVp8(seq_num + 20, kF, kF , kT); |
452 InsertVp8(seq_num + 21, false, true , true); | 560 InsertVp8(seq_num + 21, kF, kT , kT); |
453 InsertVp8(seq_num + 18, false, true , true); | 561 InsertVp8(seq_num + 18, kF, kT , kT); |
454 | 562 |
455 ASSERT_EQ(10UL, frames_from_callback_.size()); | 563 ASSERT_EQ(10UL, frames_from_callback_.size()); |
456 CheckReferences(seq_num + 2); | 564 CheckReferencesVp8(seq_num + 2); |
457 CheckReferences(seq_num + 4, seq_num + 2); | 565 CheckReferencesVp8(seq_num + 4, seq_num + 2); |
458 CheckReferences(seq_num + 8, seq_num + 4); | 566 CheckReferencesVp8(seq_num + 8, seq_num + 4); |
459 CheckReferences(seq_num + 9, seq_num + 8); | 567 CheckReferencesVp8(seq_num + 9, seq_num + 8); |
460 CheckReferences(seq_num + 11, seq_num + 9); | 568 CheckReferencesVp8(seq_num + 11, seq_num + 9); |
461 CheckReferences(seq_num + 12); | 569 CheckReferencesVp8(seq_num + 12); |
462 CheckReferences(seq_num + 17, seq_num + 12); | 570 CheckReferencesVp8(seq_num + 17, seq_num + 12); |
463 CheckReferences(seq_num + 18, seq_num + 17); | 571 CheckReferencesVp8(seq_num + 18, seq_num + 17); |
464 CheckReferences(seq_num + 20, seq_num + 18); | 572 CheckReferencesVp8(seq_num + 20, seq_num + 18); |
465 CheckReferences(seq_num + 21, seq_num + 20); | 573 CheckReferencesVp8(seq_num + 21, seq_num + 20); |
466 } | 574 } |
467 | 575 |
468 | 576 |
469 TEST_F(TestPacketBuffer, Vp8KeyFrameReferences) { | 577 TEST_F(TestPacketBuffer, Vp8KeyFrameReferences) { |
470 uint16_t pid = Rand(); | 578 uint16_t pid = Rand(); |
471 // seq_num, keyf, first, last, sync , pid, tid, tl0 | 579 // seq_num, kf, frst, lst, sync, pid, tid, tl0 |
472 InsertVp8(Rand() , true, true , true, false, pid, 0 , 0); | 580 InsertVp8(Rand() , kT, kT , kT , kF , pid, 0 , 0); |
473 | 581 |
474 ASSERT_EQ(1UL, frames_from_callback_.size()); | 582 ASSERT_EQ(1UL, frames_from_callback_.size()); |
475 CheckReferences(pid); | 583 CheckReferencesVp8(pid); |
476 } | 584 } |
477 | 585 |
478 // Test with 1 temporal layer. | 586 // Test with 1 temporal layer. |
479 TEST_F(TestPacketBuffer, Vp8TemporalLayers_0) { | 587 TEST_F(TestPacketBuffer, Vp8TemporalLayers_0) { |
480 uint16_t pid = Rand(); | 588 uint16_t pid = Rand(); |
481 uint16_t seq_num = Rand(); | 589 uint16_t seq_num = Rand(); |
482 | 590 |
483 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 591 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
484 InsertVp8(seq_num , true , true , true, false, pid , 0 , 1); | 592 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 1); |
485 InsertVp8(seq_num + 1, false, true , true, false, pid + 1, 0 , 2); | 593 InsertVp8(seq_num + 1, kF, kT , kT , kF , pid + 1, 0 , 2); |
486 InsertVp8(seq_num + 2, false, true , true, false, pid + 2, 0 , 3); | 594 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 3); |
487 InsertVp8(seq_num + 3, false, true , true, false, pid + 3, 0 , 4); | 595 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 0 , 4); |
488 | 596 |
489 ASSERT_EQ(4UL, frames_from_callback_.size()); | 597 ASSERT_EQ(4UL, frames_from_callback_.size()); |
490 CheckReferences(pid); | 598 CheckReferencesVp8(pid); |
491 CheckReferences(pid + 1, pid); | 599 CheckReferencesVp8(pid + 1, pid); |
492 CheckReferences(pid + 2, pid + 1); | 600 CheckReferencesVp8(pid + 2, pid + 1); |
493 CheckReferences(pid + 3, pid + 2); | 601 CheckReferencesVp8(pid + 3, pid + 2); |
494 } | 602 } |
495 | 603 |
496 // Test with 1 temporal layer. | 604 // Test with 1 temporal layer. |
497 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0) { | 605 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0) { |
498 uint16_t pid = Rand(); | 606 uint16_t pid = Rand(); |
499 uint16_t seq_num = Rand(); | 607 uint16_t seq_num = Rand(); |
500 | 608 |
501 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 609 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
502 InsertVp8(seq_num , true , true , true, false, pid , 0 , 1); | 610 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 1); |
503 InsertVp8(seq_num + 1, false, true , true, false, pid + 1, 0 , 2); | 611 InsertVp8(seq_num + 1, kF, kT , kT , kF , pid + 1, 0 , 2); |
504 InsertVp8(seq_num + 3, false, true , true, false, pid + 3, 0 , 4); | 612 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 0 , 4); |
505 InsertVp8(seq_num + 2, false, true , true, false, pid + 2, 0 , 3); | 613 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 3); |
506 InsertVp8(seq_num + 5, false, true , true, false, pid + 5, 0 , 6); | 614 InsertVp8(seq_num + 5, kF, kT , kT , kF , pid + 5, 0 , 6); |
507 InsertVp8(seq_num + 6, false, true , true, false, pid + 6, 0 , 7); | 615 InsertVp8(seq_num + 6, kF, kT , kT , kF , pid + 6, 0 , 7); |
508 InsertVp8(seq_num + 4, false, true , true, false, pid + 4, 0 , 5); | 616 InsertVp8(seq_num + 4, kF, kT , kT , kF , pid + 4, 0 , 5); |
509 | 617 |
510 ASSERT_EQ(7UL, frames_from_callback_.size()); | 618 ASSERT_EQ(7UL, frames_from_callback_.size()); |
511 CheckReferences(pid); | 619 CheckReferencesVp8(pid); |
512 CheckReferences(pid + 1, pid); | 620 CheckReferencesVp8(pid + 1, pid); |
513 CheckReferences(pid + 2, pid + 1); | 621 CheckReferencesVp8(pid + 2, pid + 1); |
514 CheckReferences(pid + 3, pid + 2); | 622 CheckReferencesVp8(pid + 3, pid + 2); |
515 CheckReferences(pid + 4, pid + 3); | 623 CheckReferencesVp8(pid + 4, pid + 3); |
516 CheckReferences(pid + 5, pid + 4); | 624 CheckReferencesVp8(pid + 5, pid + 4); |
517 CheckReferences(pid + 6, pid + 5); | 625 CheckReferencesVp8(pid + 6, pid + 5); |
518 } | 626 } |
519 | 627 |
520 // Test with 2 temporal layers in a 01 pattern. | 628 // Test with 2 temporal layers in a 01 pattern. |
521 TEST_F(TestPacketBuffer, Vp8TemporalLayers_01) { | 629 TEST_F(TestPacketBuffer, Vp8TemporalLayers_01) { |
522 uint16_t pid = Rand(); | 630 uint16_t pid = Rand(); |
523 uint16_t seq_num = Rand(); | 631 uint16_t seq_num = Rand(); |
524 | 632 |
525 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 633 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
526 InsertVp8(seq_num , true , true , true, false, pid , 0, 255); | 634 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0, 255); |
527 InsertVp8(seq_num + 1, false, true , true, true , pid + 1, 1, 255); | 635 InsertVp8(seq_num + 1, kF, kT , kT , kT , pid + 1, 1, 255); |
528 InsertVp8(seq_num + 2, false, true , true, false, pid + 2, 0, 0); | 636 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0, 0); |
529 InsertVp8(seq_num + 3, false, true , true, false, pid + 3, 1, 0); | 637 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 1, 0); |
530 | 638 |
531 ASSERT_EQ(4UL, frames_from_callback_.size()); | 639 ASSERT_EQ(4UL, frames_from_callback_.size()); |
532 CheckReferences(pid); | 640 CheckReferencesVp8(pid); |
533 CheckReferences(pid + 1, pid); | 641 CheckReferencesVp8(pid + 1, pid); |
534 CheckReferences(pid + 2, pid); | 642 CheckReferencesVp8(pid + 2, pid); |
535 CheckReferences(pid + 3, pid + 1, pid + 2); | 643 CheckReferencesVp8(pid + 3, pid + 1, pid + 2); |
536 } | 644 } |
537 | 645 |
538 // Test with 2 temporal layers in a 01 pattern. | 646 // Test with 2 temporal layers in a 01 pattern. |
539 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_01) { | 647 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_01) { |
540 uint16_t pid = Rand(); | 648 uint16_t pid = Rand(); |
541 uint16_t seq_num = Rand(); | 649 uint16_t seq_num = Rand(); |
542 | 650 |
543 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 651 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
544 InsertVp8(seq_num + 1, false, true , true, true , pid + 1, 1 , 255); | 652 InsertVp8(seq_num + 1, kF, kT , kT , kT , pid + 1, 1 , 255); |
545 InsertVp8(seq_num , true , true , true, false, pid , 0 , 255); | 653 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 255); |
546 InsertVp8(seq_num + 3, false, true , true, false, pid + 3, 1 , 0); | 654 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 1 , 0); |
547 InsertVp8(seq_num + 5, false, true , true, false, pid + 5, 1 , 1); | 655 InsertVp8(seq_num + 5, kF, kT , kT , kF , pid + 5, 1 , 1); |
548 InsertVp8(seq_num + 2, false, true , true, false, pid + 2, 0 , 0); | 656 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 0); |
549 InsertVp8(seq_num + 4, false, true , true, false, pid + 4, 0 , 1); | 657 InsertVp8(seq_num + 4, kF, kT , kT , kF , pid + 4, 0 , 1); |
550 InsertVp8(seq_num + 6, false, true , true, false, pid + 6, 0 , 2); | 658 InsertVp8(seq_num + 6, kF, kT , kT , kF , pid + 6, 0 , 2); |
551 InsertVp8(seq_num + 7, false, true , true, false, pid + 7, 1 , 2); | 659 InsertVp8(seq_num + 7, kF, kT , kT , kF , pid + 7, 1 , 2); |
552 | 660 |
553 ASSERT_EQ(8UL, frames_from_callback_.size()); | 661 ASSERT_EQ(8UL, frames_from_callback_.size()); |
554 CheckReferences(pid); | 662 CheckReferencesVp8(pid); |
555 CheckReferences(pid + 1, pid); | 663 CheckReferencesVp8(pid + 1, pid); |
556 CheckReferences(pid + 2, pid); | 664 CheckReferencesVp8(pid + 2, pid); |
557 CheckReferences(pid + 3, pid + 1, pid + 2); | 665 CheckReferencesVp8(pid + 3, pid + 1, pid + 2); |
558 CheckReferences(pid + 4, pid + 2); | 666 CheckReferencesVp8(pid + 4, pid + 2); |
559 CheckReferences(pid + 5, pid + 3, pid + 4); | 667 CheckReferencesVp8(pid + 5, pid + 3, pid + 4); |
560 CheckReferences(pid + 6, pid + 4); | 668 CheckReferencesVp8(pid + 6, pid + 4); |
561 CheckReferences(pid + 7, pid + 5, pid + 6); | 669 CheckReferencesVp8(pid + 7, pid + 5, pid + 6); |
562 } | 670 } |
563 | 671 |
564 // Test with 3 temporal layers in a 0212 pattern. | 672 // Test with 3 temporal layers in a 0212 pattern. |
565 TEST_F(TestPacketBuffer, Vp8TemporalLayers_0212) { | 673 TEST_F(TestPacketBuffer, Vp8TemporalLayers_0212) { |
566 uint16_t pid = Rand(); | 674 uint16_t pid = Rand(); |
567 uint16_t seq_num = Rand(); | 675 uint16_t seq_num = Rand(); |
568 | 676 |
569 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 677 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
570 InsertVp8(seq_num , true , true , true , false, pid , 0 , 55); | 678 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 55); |
571 InsertVp8(seq_num + 1 , false, true , true , true , pid + 1 , 2 , 55); | 679 InsertVp8(seq_num + 1 , kF, kT , kT , kT , pid + 1 , 2 , 55); |
572 InsertVp8(seq_num + 2 , false, true , true , true , pid + 2 , 1 , 55); | 680 InsertVp8(seq_num + 2 , kF, kT , kT , kT , pid + 2 , 1 , 55); |
573 InsertVp8(seq_num + 3 , false, true , true , false, pid + 3 , 2 , 55); | 681 InsertVp8(seq_num + 3 , kF, kT , kT , kF , pid + 3 , 2 , 55); |
574 InsertVp8(seq_num + 4 , false, true , true , false, pid + 4 , 0 , 56); | 682 InsertVp8(seq_num + 4 , kF, kT , kT , kF , pid + 4 , 0 , 56); |
575 InsertVp8(seq_num + 5 , false, true , true , false, pid + 5 , 2 , 56); | 683 InsertVp8(seq_num + 5 , kF, kT , kT , kF , pid + 5 , 2 , 56); |
576 InsertVp8(seq_num + 6 , false, true , true , false, pid + 6 , 1 , 56); | 684 InsertVp8(seq_num + 6 , kF, kT , kT , kF , pid + 6 , 1 , 56); |
577 InsertVp8(seq_num + 7 , false, true , true , false, pid + 7 , 2 , 56); | 685 InsertVp8(seq_num + 7 , kF, kT , kT , kF , pid + 7 , 2 , 56); |
578 InsertVp8(seq_num + 8 , false, true , true , false, pid + 8 , 0 , 57); | 686 InsertVp8(seq_num + 8 , kF, kT , kT , kF , pid + 8 , 0 , 57); |
579 InsertVp8(seq_num + 9 , false, true , true , true , pid + 9 , 2 , 57); | 687 InsertVp8(seq_num + 9 , kF, kT , kT , kT , pid + 9 , 2 , 57); |
580 InsertVp8(seq_num + 10, false, true , true , true , pid + 10, 1 , 57); | 688 InsertVp8(seq_num + 10, kF, kT , kT , kT , pid + 10, 1 , 57); |
581 InsertVp8(seq_num + 11, false, true , true , false, pid + 11, 2 , 57); | 689 InsertVp8(seq_num + 11, kF, kT , kT , kF , pid + 11, 2 , 57); |
582 | 690 |
583 ASSERT_EQ(12UL, frames_from_callback_.size()); | 691 ASSERT_EQ(12UL, frames_from_callback_.size()); |
584 CheckReferences(pid); | 692 CheckReferencesVp8(pid); |
585 CheckReferences(pid + 1 , pid); | 693 CheckReferencesVp8(pid + 1 , pid); |
586 CheckReferences(pid + 2 , pid); | 694 CheckReferencesVp8(pid + 2 , pid); |
587 CheckReferences(pid + 3 , pid, pid + 1, pid + 2); | 695 CheckReferencesVp8(pid + 3 , pid, pid + 1, pid + 2); |
588 CheckReferences(pid + 4 , pid); | 696 CheckReferencesVp8(pid + 4 , pid); |
589 CheckReferences(pid + 5 , pid + 2, pid + 3, pid + 4); | 697 CheckReferencesVp8(pid + 5 , pid + 2, pid + 3, pid + 4); |
590 CheckReferences(pid + 6 , pid + 2, pid + 4); | 698 CheckReferencesVp8(pid + 6 , pid + 2, pid + 4); |
591 CheckReferences(pid + 7 , pid + 4, pid + 5, pid + 6); | 699 CheckReferencesVp8(pid + 7 , pid + 4, pid + 5, pid + 6); |
592 CheckReferences(pid + 8 , pid + 4); | 700 CheckReferencesVp8(pid + 8 , pid + 4); |
593 CheckReferences(pid + 9 , pid + 8); | 701 CheckReferencesVp8(pid + 9 , pid + 8); |
594 CheckReferences(pid + 10, pid + 8); | 702 CheckReferencesVp8(pid + 10, pid + 8); |
595 CheckReferences(pid + 11, pid + 8, pid + 9, pid + 10); | 703 CheckReferencesVp8(pid + 11, pid + 8, pid + 9, pid + 10); |
596 } | 704 } |
597 | 705 |
598 // Test with 3 temporal layers in a 0212 pattern. | 706 // Test with 3 temporal layers in a 0212 pattern. |
599 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0212) { | 707 TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0212) { |
600 uint16_t pid = 126; | 708 uint16_t pid = 126; |
601 uint16_t seq_num = Rand(); | 709 uint16_t seq_num = Rand(); |
602 | 710 |
603 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 711 // seq_num , kf, frst, lst, sync, pid , tid, tl0 |
604 InsertVp8(seq_num + 1 , false, true , true, true , pid + 1 , 2 , 55); | 712 InsertVp8(seq_num + 1 , kF, kT , kT , kT , pid + 1 , 2 , 55); |
605 InsertVp8(seq_num , true , true , true, false, pid , 0 , 55); | 713 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 55); |
606 InsertVp8(seq_num + 2 , false, true , true, true , pid + 2 , 1 , 55); | 714 InsertVp8(seq_num + 2 , kF, kT , kT , kT , pid + 2 , 1 , 55); |
607 InsertVp8(seq_num + 4 , false, true , true, false, pid + 4 , 0 , 56); | 715 InsertVp8(seq_num + 4 , kF, kT , kT , kF , pid + 4 , 0 , 56); |
608 InsertVp8(seq_num + 5 , false, true , true, false, pid + 5 , 2 , 56); | 716 InsertVp8(seq_num + 5 , kF, kT , kT , kF , pid + 5 , 2 , 56); |
609 InsertVp8(seq_num + 3 , false, true , true, false, pid + 3 , 2 , 55); | 717 InsertVp8(seq_num + 3 , kF, kT , kT , kF , pid + 3 , 2 , 55); |
610 InsertVp8(seq_num + 7 , false, true , true, false, pid + 7 , 2 , 56); | 718 InsertVp8(seq_num + 7 , kF, kT , kT , kF , pid + 7 , 2 , 56); |
611 InsertVp8(seq_num + 9 , false, true , true, true , pid + 9 , 2 , 57); | 719 InsertVp8(seq_num + 9 , kF, kT , kT , kT , pid + 9 , 2 , 57); |
612 InsertVp8(seq_num + 6 , false, true , true, false, pid + 6 , 1 , 56); | 720 InsertVp8(seq_num + 6 , kF, kT , kT , kF , pid + 6 , 1 , 56); |
613 InsertVp8(seq_num + 8 , false, true , true, false, pid + 8 , 0 , 57); | 721 InsertVp8(seq_num + 8 , kF, kT , kT , kF , pid + 8 , 0 , 57); |
614 InsertVp8(seq_num + 11, false, true , true, false, pid + 11, 2 , 57); | 722 InsertVp8(seq_num + 11, kF, kT , kT , kF , pid + 11, 2 , 57); |
615 InsertVp8(seq_num + 10, false, true , true, true , pid + 10, 1 , 57); | 723 InsertVp8(seq_num + 10, kF, kT , kT , kT , pid + 10, 1 , 57); |
616 | 724 |
617 ASSERT_EQ(12UL, frames_from_callback_.size()); | 725 ASSERT_EQ(12UL, frames_from_callback_.size()); |
618 CheckReferences(pid); | 726 CheckReferencesVp8(pid); |
619 CheckReferences(pid + 1 , pid); | 727 CheckReferencesVp8(pid + 1 , pid); |
620 CheckReferences(pid + 2 , pid); | 728 CheckReferencesVp8(pid + 2 , pid); |
621 CheckReferences(pid + 3 , pid, pid + 1, pid + 2); | 729 CheckReferencesVp8(pid + 3 , pid, pid + 1, pid + 2); |
622 CheckReferences(pid + 4 , pid); | 730 CheckReferencesVp8(pid + 4 , pid); |
623 CheckReferences(pid + 5 , pid + 2, pid + 3, pid + 4); | 731 CheckReferencesVp8(pid + 5 , pid + 2, pid + 3, pid + 4); |
624 CheckReferences(pid + 6 , pid + 2, pid + 4); | 732 CheckReferencesVp8(pid + 6 , pid + 2, pid + 4); |
625 CheckReferences(pid + 7 , pid + 4, pid + 5, pid + 6); | 733 CheckReferencesVp8(pid + 7 , pid + 4, pid + 5, pid + 6); |
626 CheckReferences(pid + 8 , pid + 4); | 734 CheckReferencesVp8(pid + 8 , pid + 4); |
627 CheckReferences(pid + 9 , pid + 8); | 735 CheckReferencesVp8(pid + 9 , pid + 8); |
628 CheckReferences(pid + 10, pid + 8); | 736 CheckReferencesVp8(pid + 10, pid + 8); |
629 CheckReferences(pid + 11, pid + 8, pid + 9, pid + 10); | 737 CheckReferencesVp8(pid + 11, pid + 8, pid + 9, pid + 10); |
630 } | 738 } |
631 | 739 |
632 TEST_F(TestPacketBuffer, Vp8InsertManyFrames_0212) { | 740 TEST_F(TestPacketBuffer, Vp8InsertManyFrames_0212) { |
633 uint16_t pid = Rand(); | 741 uint16_t pid = Rand(); |
634 uint16_t seq_num = Rand(); | 742 uint16_t seq_num = Rand(); |
635 | 743 |
636 const int keyframes_to_insert = 50; | 744 const int keyframes_to_insert = 50; |
637 const int frames_per_keyframe = 120; // Should be a multiple of 4. | 745 const int frames_per_keyframe = 120; // Should be a multiple of 4. |
638 uint8_t tl0 = 128; | 746 uint8_t tl0 = 128; |
639 | 747 |
640 for (int k = 0; k < keyframes_to_insert; ++k) { | 748 for (int k = 0; k < keyframes_to_insert; ++k) { |
641 // seq_num , keyf , first, last , sync , pid , tid, tl0 | 749 // seq_num , keyf, frst, lst, sync, pid , tid, tl0 |
642 InsertVp8(seq_num , true , true , true , false, pid , 0 , tl0); | 750 InsertVp8(seq_num , kT , kT , kT , kF , pid , 0 , tl0); |
643 InsertVp8(seq_num + 1, false, true , true , true , pid + 1, 2 , tl0); | 751 InsertVp8(seq_num + 1, kF , kT , kT , kT , pid + 1, 2 , tl0); |
644 InsertVp8(seq_num + 2, false, true , true , true , pid + 2, 1 , tl0); | 752 InsertVp8(seq_num + 2, kF , kT , kT , kT , pid + 2, 1 , tl0); |
645 InsertVp8(seq_num + 3, false, true , true , false, pid + 3, 2 , tl0); | 753 InsertVp8(seq_num + 3, kF , kT , kT , kF , pid + 3, 2 , tl0); |
646 CheckReferences(pid); | 754 CheckReferencesVp8(pid); |
647 CheckReferences(pid + 1, pid); | 755 CheckReferencesVp8(pid + 1, pid); |
648 CheckReferences(pid + 2, pid); | 756 CheckReferencesVp8(pid + 2, pid); |
649 CheckReferences(pid + 3, pid, pid + 1, pid + 2); | 757 CheckReferencesVp8(pid + 3, pid, pid + 1, pid + 2); |
650 frames_from_callback_.clear(); | 758 frames_from_callback_.clear(); |
651 ++tl0; | 759 ++tl0; |
652 | 760 |
653 for (int f = 4; f < frames_per_keyframe; f += 4) { | 761 for (int f = 4; f < frames_per_keyframe; f += 4) { |
654 uint16_t sf = seq_num + f; | 762 uint16_t sf = seq_num + f; |
655 uint16_t pidf = pid + f; | 763 uint16_t pidf = pid + f; |
656 | 764 |
657 // seq_num, keyf , first, last, sync , pid , tid, tl0 | 765 // seq_num, keyf, frst, lst, sync, pid , tid, tl0 |
658 InsertVp8(sf , false, true , true, false, pidf , 0 , tl0); | 766 InsertVp8(sf , kF , kT , kT , kF , pidf , 0 , tl0); |
659 InsertVp8(sf + 1 , false, true , true, false, pidf + 1, 2 , tl0); | 767 InsertVp8(sf + 1 , kF , kT , kT , kF , pidf + 1, 2 , tl0); |
660 InsertVp8(sf + 2 , false, true , true, false, pidf + 2, 1 , tl0); | 768 InsertVp8(sf + 2 , kF , kT , kT , kF , pidf + 2, 1 , tl0); |
661 InsertVp8(sf + 3 , false, true , true, false, pidf + 3, 2 , tl0); | 769 InsertVp8(sf + 3 , kF , kT , kT , kF , pidf + 3, 2 , tl0); |
662 CheckReferences(pidf, pidf - 4); | 770 CheckReferencesVp8(pidf, pidf - 4); |
663 CheckReferences(pidf + 1, pidf, pidf - 1, pidf - 2); | 771 CheckReferencesVp8(pidf + 1, pidf, pidf - 1, pidf - 2); |
664 CheckReferences(pidf + 2, pidf, pidf - 2); | 772 CheckReferencesVp8(pidf + 2, pidf, pidf - 2); |
665 CheckReferences(pidf + 3, pidf, pidf + 1, pidf + 2); | 773 CheckReferencesVp8(pidf + 3, pidf, pidf + 1, pidf + 2); |
666 frames_from_callback_.clear(); | 774 frames_from_callback_.clear(); |
667 ++tl0; | 775 ++tl0; |
668 } | 776 } |
669 | 777 |
670 pid += frames_per_keyframe; | 778 pid += frames_per_keyframe; |
671 seq_num += frames_per_keyframe; | 779 seq_num += frames_per_keyframe; |
672 } | 780 } |
673 } | 781 } |
674 | 782 |
675 TEST_F(TestPacketBuffer, Vp8LayerSync) { | 783 TEST_F(TestPacketBuffer, Vp8LayerSync) { |
676 uint16_t pid = Rand(); | 784 uint16_t pid = Rand(); |
677 uint16_t seq_num = Rand(); | 785 uint16_t seq_num = Rand(); |
678 | 786 |
679 // seq_num , keyf , first, last, sync , pid , tid, tl0 | 787 // seq_num , keyf, frst, lst, sync, pid , tid, tl0 |
680 InsertVp8(seq_num , true , true , true, false, pid , 0 , 0); | 788 InsertVp8(seq_num , kT , kT , kT , kF , pid , 0 , 0); |
681 InsertVp8(seq_num + 1 , false, true , true, true , pid + 1 , 1 , 0); | 789 InsertVp8(seq_num + 1 , kF , kT , kT , kT , pid + 1 , 1 , 0); |
682 InsertVp8(seq_num + 2 , false, true , true, false, pid + 2 , 0 , 1); | 790 InsertVp8(seq_num + 2 , kF , kT , kT , kF , pid + 2 , 0 , 1); |
683 ASSERT_EQ(3UL, frames_from_callback_.size()); | 791 ASSERT_EQ(3UL, frames_from_callback_.size()); |
684 | 792 |
685 InsertVp8(seq_num + 4 , false, true , true, false, pid + 4 , 0 , 2); | 793 InsertVp8(seq_num + 4 , kF , kT , kT , kF , pid + 4 , 0 , 2); |
686 InsertVp8(seq_num + 5 , false, true , true, true , pid + 5 , 1 , 2); | 794 InsertVp8(seq_num + 5 , kF , kT , kT , kT , pid + 5 , 1 , 2); |
687 InsertVp8(seq_num + 6 , false, true , true, false, pid + 6 , 0 , 3); | 795 InsertVp8(seq_num + 6 , kF , kT , kT , kF , pid + 6 , 0 , 3); |
688 InsertVp8(seq_num + 7 , false, true , true, false, pid + 7 , 1 , 3); | 796 InsertVp8(seq_num + 7 , kF , kT , kT , kF , pid + 7 , 1 , 3); |
689 | 797 |
690 ASSERT_EQ(7UL, frames_from_callback_.size()); | 798 ASSERT_EQ(7UL, frames_from_callback_.size()); |
691 CheckReferences(pid); | 799 CheckReferencesVp8(pid); |
692 CheckReferences(pid + 1, pid); | 800 CheckReferencesVp8(pid + 1, pid); |
693 CheckReferences(pid + 2, pid); | 801 CheckReferencesVp8(pid + 2, pid); |
694 CheckReferences(pid + 4, pid + 2); | 802 CheckReferencesVp8(pid + 4, pid + 2); |
695 CheckReferences(pid + 5, pid + 4); | 803 CheckReferencesVp8(pid + 5, pid + 4); |
696 CheckReferences(pid + 6, pid + 4); | 804 CheckReferencesVp8(pid + 6, pid + 4); |
697 CheckReferences(pid + 7, pid + 6, pid + 5); | 805 CheckReferencesVp8(pid + 7, pid + 6, pid + 5); |
698 } | 806 } |
699 | 807 |
700 TEST_F(TestPacketBuffer, Vp8InsertLargeFrames) { | 808 TEST_F(TestPacketBuffer, Vp8InsertLargeFrames) { |
701 packet_buffer_.reset(new PacketBuffer(1 << 3, 1 << 12, this)); | 809 packet_buffer_.reset(new PacketBuffer(1 << 3, 1 << 12, this)); |
702 uint16_t pid = Rand(); | 810 uint16_t pid = Rand(); |
703 uint16_t seq_num = Rand(); | 811 uint16_t seq_num = Rand(); |
704 | 812 |
705 const uint16_t packets_per_frame = 1000; | 813 const uint16_t packets_per_frame = 1000; |
706 uint16_t current = seq_num; | 814 uint16_t current = seq_num; |
707 uint16_t end = current + packets_per_frame; | 815 uint16_t end = current + packets_per_frame; |
708 | 816 |
709 // seq_num , keyf , first, last , sync , pid, tid, tl0 | 817 // seq_num , keyf, frst, lst, sync, pid, tid, tl0 |
710 InsertVp8(current++, true , true , false, false, pid, 0 , 0); | 818 InsertVp8(current++, kT , kT , kF , kF , pid, 0 , 0); |
711 while (current != end) | 819 while (current != end) |
712 InsertVp8(current++, false, false, false, false, pid, 0 , 0); | 820 InsertVp8(current++, kF , kF , kF , kF , pid, 0 , 0); |
713 InsertVp8(current++, false, false, true , false, pid, 0 , 0); | 821 InsertVp8(current++, kF , kF , kT , kF , pid, 0 , 0); |
714 end = current + packets_per_frame; | 822 end = current + packets_per_frame; |
715 | 823 |
716 for (int f = 1; f < 4; ++f) { | 824 for (int f = 1; f < 4; ++f) { |
717 InsertVp8(current++, false, true , false, false, pid + f, 0, f); | 825 InsertVp8(current++, kF , kT , kF , kF , pid + f, 0, f); |
718 while (current != end) | 826 while (current != end) |
719 InsertVp8(current++, false, false, false, false, pid + f, 0, f); | 827 InsertVp8(current++, kF , kF , kF , kF , pid + f, 0, f); |
720 InsertVp8(current++, false, false, true , false, pid + f, 0, f); | 828 InsertVp8(current++, kF , kF , kT , kF , pid + f, 0, f); |
721 end = current + packets_per_frame; | 829 end = current + packets_per_frame; |
722 } | 830 } |
723 | 831 |
724 ASSERT_EQ(4UL, frames_from_callback_.size()); | 832 ASSERT_EQ(4UL, frames_from_callback_.size()); |
725 CheckReferences(pid); | 833 CheckReferencesVp8(pid); |
726 CheckReferences(pid + 1, pid); | 834 CheckReferencesVp8(pid + 1, pid); |
727 CheckReferences(pid + 2, pid + 1); | 835 CheckReferencesVp8(pid + 2, pid + 1); |
728 CheckReferences(pid + 3, pid + 2); | 836 CheckReferencesVp8(pid + 3, pid + 2); |
837 } | |
838 | |
839 TEST_F(TestPacketBuffer, Vp9GofInsertOneFrame) { | |
840 uint16_t pid = Rand(); | |
841 uint16_t seq_num = Rand(); | |
842 GofInfoVP9 ss; | |
843 | |
844 // seq_num, keyf, frst, lst, up, pid, sid, tid, tl0, ss | |
845 InsertVp9Gof(seq_num, kT , kT , kT , kF, pid, 0 , 0 , 0 , &ss); | |
846 | |
847 CheckReferencesVp9(pid, 0); | |
848 } | |
849 | |
850 TEST_F(TestPacketBuffer, Vp9NoPictureIdReordered) { | |
851 uint16_t sn = 0xfffa; | |
852 | |
853 // sn , kf, frst, lst | |
854 InsertVp9Gof(sn + 1 , kF, kF , kF); | |
855 InsertVp9Gof(sn , kT, kT , kF); | |
856 InsertVp9Gof(sn + 2 , kF, kF , kT); | |
857 InsertVp9Gof(sn + 4 , kF, kF , kT); | |
858 InsertVp9Gof(sn + 6 , kF, kF , kF); | |
859 InsertVp9Gof(sn + 3 , kF, kT , kF); | |
860 InsertVp9Gof(sn + 7 , kF, kF , kF); | |
861 InsertVp9Gof(sn + 5 , kF, kT , kF); | |
862 InsertVp9Gof(sn + 9 , kF, kT , kT); | |
863 InsertVp9Gof(sn + 10, kF, kT , kF); | |
864 InsertVp9Gof(sn + 8 , kF, kF , kT); | |
865 InsertVp9Gof(sn + 13, kF, kT , kF); | |
866 InsertVp9Gof(sn + 14, kF, kF , kF); | |
867 InsertVp9Gof(sn + 12, kT, kT , kT); | |
868 InsertVp9Gof(sn + 11, kF, kF , kT); | |
869 InsertVp9Gof(sn + 16, kF, kF , kF); | |
870 InsertVp9Gof(sn + 19, kF, kT , kF); | |
871 InsertVp9Gof(sn + 15, kF, kF , kF); | |
872 InsertVp9Gof(sn + 17, kF, kF , kT); | |
873 InsertVp9Gof(sn + 20, kF, kF , kT); | |
874 InsertVp9Gof(sn + 21, kF, kT , kT); | |
875 InsertVp9Gof(sn + 18, kF, kT , kT); | |
876 | |
877 ASSERT_EQ(10UL, frames_from_callback_.size()); | |
878 CheckReferencesVp9(sn + 2 , 0); | |
879 CheckReferencesVp9(sn + 4 , 0, sn + 2); | |
880 CheckReferencesVp9(sn + 8 , 0, sn + 4); | |
881 CheckReferencesVp9(sn + 9 , 0, sn + 8); | |
882 CheckReferencesVp9(sn + 11, 0, sn + 9); | |
883 CheckReferencesVp9(sn + 12, 0); | |
884 CheckReferencesVp9(sn + 17, 0, sn + 12); | |
885 CheckReferencesVp9(sn + 18, 0, sn + 17); | |
886 CheckReferencesVp9(sn + 20, 0, sn + 18); | |
887 CheckReferencesVp9(sn + 21, 0, sn + 20); | |
888 } | |
889 | |
890 TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_0) { | |
891 uint16_t pid = Rand(); | |
892 uint16_t sn = Rand(); | |
893 GofInfoVP9 ss; | |
894 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer. | |
895 | |
896 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
897 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
898 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 0 , 1); | |
899 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 2); | |
900 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 0 , 3); | |
901 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 4); | |
902 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 0 , 5); | |
903 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 6); | |
904 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 0 , 7); | |
905 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 8); | |
906 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 0 , 9); | |
907 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 10); | |
908 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 0 , 11); | |
909 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 12); | |
910 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 0 , 13); | |
911 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 14); | |
912 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 0 , 15); | |
913 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 16); | |
914 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 0 , 17); | |
915 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 18); | |
916 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 0 , 19); | |
917 | |
918 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
919 CheckReferencesVp9(pid, 0); | |
920 CheckReferencesVp9(pid + 1 , 0, pid); | |
921 CheckReferencesVp9(pid + 2 , 0, pid + 1); | |
922 CheckReferencesVp9(pid + 3 , 0, pid + 2); | |
923 CheckReferencesVp9(pid + 4 , 0, pid + 3); | |
924 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
925 CheckReferencesVp9(pid + 6 , 0, pid + 5); | |
926 CheckReferencesVp9(pid + 7 , 0, pid + 6); | |
927 CheckReferencesVp9(pid + 8 , 0, pid + 7); | |
928 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
929 CheckReferencesVp9(pid + 10, 0, pid + 9); | |
930 CheckReferencesVp9(pid + 11, 0, pid + 10); | |
931 CheckReferencesVp9(pid + 12, 0, pid + 11); | |
932 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
933 CheckReferencesVp9(pid + 14, 0, pid + 13); | |
934 CheckReferencesVp9(pid + 15, 0, pid + 14); | |
935 CheckReferencesVp9(pid + 16, 0, pid + 15); | |
936 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
937 CheckReferencesVp9(pid + 18, 0, pid + 17); | |
938 CheckReferencesVp9(pid + 19, 0, pid + 18); | |
939 } | |
940 | |
941 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_0) { | |
942 uint16_t pid = Rand(); | |
943 uint16_t sn = Rand(); | |
944 GofInfoVP9 ss; | |
945 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer. | |
946 | |
947 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
948 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 2); | |
949 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 0 , 1); | |
950 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
951 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 4); | |
952 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 0 , 3); | |
953 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 0 , 5); | |
954 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 0 , 7); | |
955 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 6); | |
956 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 8); | |
957 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 10); | |
958 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 0 , 13); | |
959 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 0 , 11); | |
960 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 0 , 9); | |
961 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 16); | |
962 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 14); | |
963 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 0 , 15); | |
964 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 12); | |
965 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 0 , 17); | |
966 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 0 , 19); | |
967 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 18); | |
968 | |
969 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
970 CheckReferencesVp9(pid, 0); | |
971 CheckReferencesVp9(pid + 1 , 0, pid); | |
972 CheckReferencesVp9(pid + 2 , 0, pid + 1); | |
973 CheckReferencesVp9(pid + 3 , 0, pid + 2); | |
974 CheckReferencesVp9(pid + 4 , 0, pid + 3); | |
975 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
976 CheckReferencesVp9(pid + 6 , 0, pid + 5); | |
977 CheckReferencesVp9(pid + 7 , 0, pid + 6); | |
978 CheckReferencesVp9(pid + 8 , 0, pid + 7); | |
979 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
980 CheckReferencesVp9(pid + 10, 0, pid + 9); | |
981 CheckReferencesVp9(pid + 11, 0, pid + 10); | |
982 CheckReferencesVp9(pid + 12, 0, pid + 11); | |
983 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
984 CheckReferencesVp9(pid + 14, 0, pid + 13); | |
985 CheckReferencesVp9(pid + 15, 0, pid + 14); | |
986 CheckReferencesVp9(pid + 16, 0, pid + 15); | |
987 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
988 CheckReferencesVp9(pid + 18, 0, pid + 17); | |
989 CheckReferencesVp9(pid + 19, 0, pid + 18); | |
990 } | |
991 | |
992 TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_01) { | |
993 uint16_t pid = Rand(); | |
994 uint16_t sn = Rand(); | |
995 GofInfoVP9 ss; | |
996 ss.SetGofInfoVP9(kTemporalStructureMode2); // 0101 pattern | |
997 | |
998 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
999 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1000 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0); | |
1001 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1); | |
1002 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1); | |
1003 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2); | |
1004 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 1 , 2); | |
1005 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 3); | |
1006 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 1 , 3); | |
1007 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 4); | |
1008 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 1 , 4); | |
1009 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 5); | |
1010 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 1 , 5); | |
1011 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 6); | |
1012 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 1 , 6); | |
1013 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 7); | |
1014 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 1 , 7); | |
1015 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 8); | |
1016 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 1 , 8); | |
1017 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 9); | |
1018 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 1 , 9); | |
1019 | |
1020 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
1021 CheckReferencesVp9(pid, 0); | |
1022 CheckReferencesVp9(pid + 1 , 0, pid); | |
1023 CheckReferencesVp9(pid + 2 , 0, pid); | |
1024 CheckReferencesVp9(pid + 3 , 0, pid + 2); | |
1025 CheckReferencesVp9(pid + 4 , 0, pid + 2); | |
1026 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
1027 CheckReferencesVp9(pid + 6 , 0, pid + 4); | |
1028 CheckReferencesVp9(pid + 7 , 0, pid + 6); | |
1029 CheckReferencesVp9(pid + 8 , 0, pid + 6); | |
1030 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1031 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1032 CheckReferencesVp9(pid + 11, 0, pid + 10); | |
1033 CheckReferencesVp9(pid + 12, 0, pid + 10); | |
1034 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
1035 CheckReferencesVp9(pid + 14, 0, pid + 12); | |
1036 CheckReferencesVp9(pid + 15, 0, pid + 14); | |
1037 CheckReferencesVp9(pid + 16, 0, pid + 14); | |
1038 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
1039 CheckReferencesVp9(pid + 18, 0, pid + 16); | |
1040 CheckReferencesVp9(pid + 19, 0, pid + 18); | |
1041 } | |
1042 | |
1043 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_01) { | |
1044 uint16_t pid = Rand(); | |
1045 uint16_t sn = Rand(); | |
1046 GofInfoVP9 ss; | |
1047 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern | |
1048 | |
1049 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
1050 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0); | |
1051 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1052 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1); | |
1053 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2); | |
1054 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1); | |
1055 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 1 , 2); | |
1056 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 1 , 3); | |
1057 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 3); | |
1058 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 5); | |
1059 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 4); | |
1060 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 1 , 4); | |
1061 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 1 , 5); | |
1062 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 1 , 6); | |
1063 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 8); | |
1064 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 6); | |
1065 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 7); | |
1066 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 1 , 8); | |
1067 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 1 , 9); | |
1068 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 1 , 7); | |
1069 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 9); | |
1070 | |
1071 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
1072 CheckReferencesVp9(pid, 0); | |
1073 CheckReferencesVp9(pid + 1 , 0, pid); | |
1074 CheckReferencesVp9(pid + 2 , 0, pid); | |
1075 CheckReferencesVp9(pid + 3 , 0, pid + 2); | |
1076 CheckReferencesVp9(pid + 4 , 0, pid + 2); | |
1077 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
1078 CheckReferencesVp9(pid + 6 , 0, pid + 4); | |
1079 CheckReferencesVp9(pid + 7 , 0, pid + 6); | |
1080 CheckReferencesVp9(pid + 8 , 0, pid + 6); | |
1081 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1082 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1083 CheckReferencesVp9(pid + 11, 0, pid + 10); | |
1084 CheckReferencesVp9(pid + 12, 0, pid + 10); | |
1085 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
1086 CheckReferencesVp9(pid + 14, 0, pid + 12); | |
1087 CheckReferencesVp9(pid + 15, 0, pid + 14); | |
1088 CheckReferencesVp9(pid + 16, 0, pid + 14); | |
1089 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
1090 CheckReferencesVp9(pid + 18, 0, pid + 16); | |
1091 CheckReferencesVp9(pid + 19, 0, pid + 18); | |
1092 } | |
1093 | |
1094 TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_0212) { | |
1095 uint16_t pid = Rand(); | |
1096 uint16_t sn = Rand(); | |
1097 GofInfoVP9 ss; | |
1098 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern | |
1099 | |
1100 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
1101 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1102 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0); | |
1103 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0); | |
1104 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0); | |
1105 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1); | |
1106 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1); | |
1107 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 1); | |
1108 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1); | |
1109 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 2); | |
1110 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2); | |
1111 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2); | |
1112 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 2); | |
1113 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3); | |
1114 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3); | |
1115 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3); | |
1116 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3); | |
1117 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 4); | |
1118 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 2 , 4); | |
1119 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 1 , 4); | |
1120 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 2 , 4); | |
1121 | |
1122 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
1123 CheckReferencesVp9(pid, 0); | |
1124 CheckReferencesVp9(pid + 1 , 0, pid); | |
1125 CheckReferencesVp9(pid + 2 , 0, pid); | |
1126 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2); | |
1127 CheckReferencesVp9(pid + 4 , 0, pid); | |
1128 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
1129 CheckReferencesVp9(pid + 6 , 0, pid + 4); | |
1130 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6); | |
1131 CheckReferencesVp9(pid + 8 , 0, pid + 4); | |
1132 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1133 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1134 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10); | |
1135 CheckReferencesVp9(pid + 12, 0, pid + 8); | |
1136 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
1137 CheckReferencesVp9(pid + 14, 0, pid + 12); | |
1138 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14); | |
1139 CheckReferencesVp9(pid + 16, 0, pid + 12); | |
1140 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
1141 CheckReferencesVp9(pid + 18, 0, pid + 16); | |
1142 CheckReferencesVp9(pid + 19, 0, pid + 17, pid + 18); | |
1143 } | |
1144 | |
1145 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_0212) { | |
1146 uint16_t pid = Rand(); | |
1147 uint16_t sn = Rand(); | |
1148 GofInfoVP9 ss; | |
1149 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern | |
1150 | |
1151 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
1152 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0); | |
1153 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0); | |
1154 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1155 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0); | |
1156 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 1); | |
1157 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1); | |
1158 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1); | |
1159 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2); | |
1160 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1); | |
1161 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 2); | |
1162 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 2); | |
1163 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2); | |
1164 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3); | |
1165 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3); | |
1166 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3); | |
1167 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 4); | |
1168 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3); | |
1169 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 2 , 4); | |
1170 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 2 , 4); | |
1171 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 1 , 4); | |
1172 | |
1173 ASSERT_EQ(20UL, frames_from_callback_.size()); | |
1174 CheckReferencesVp9(pid, 0); | |
1175 CheckReferencesVp9(pid + 1 , 0, pid); | |
1176 CheckReferencesVp9(pid + 2 , 0, pid); | |
1177 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2); | |
1178 CheckReferencesVp9(pid + 4 , 0, pid); | |
1179 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
1180 CheckReferencesVp9(pid + 6 , 0, pid + 4); | |
1181 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6); | |
1182 CheckReferencesVp9(pid + 8 , 0, pid + 4); | |
1183 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1184 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1185 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10); | |
1186 CheckReferencesVp9(pid + 12, 0, pid + 8); | |
1187 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
1188 CheckReferencesVp9(pid + 14, 0, pid + 12); | |
1189 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14); | |
1190 CheckReferencesVp9(pid + 16, 0, pid + 12); | |
1191 CheckReferencesVp9(pid + 17, 0, pid + 16); | |
1192 CheckReferencesVp9(pid + 18, 0, pid + 16); | |
1193 CheckReferencesVp9(pid + 19, 0, pid + 17, pid + 18); | |
1194 } | |
1195 | |
1196 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersUpSwitch_02120212) { | |
1197 uint16_t pid = Rand(); | |
1198 uint16_t sn = Rand(); | |
1199 GofInfoVP9 ss; | |
1200 ss.SetGofInfoVP9(kTemporalStructureMode4); // 02120212 pattern | |
1201 | |
1202 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
1203 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1204 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0); | |
1205 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0); | |
1206 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0); | |
1207 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1); | |
1208 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1); | |
1209 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 1); | |
1210 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1); | |
1211 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 2); | |
1212 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2); | |
1213 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2); | |
1214 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 2); | |
1215 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3); | |
1216 InsertVp9Gof(sn + 13, kF, kT , kT , kT, pid + 13, 0 , 2 , 3); | |
1217 InsertVp9Gof(sn + 14, kF, kT , kT , kT, pid + 14, 0 , 1 , 3); | |
1218 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3); | |
1219 | |
1220 ASSERT_EQ(16UL, frames_from_callback_.size()); | |
1221 CheckReferencesVp9(pid, 0); | |
1222 CheckReferencesVp9(pid + 1 , 0, pid); | |
1223 CheckReferencesVp9(pid + 2 , 0, pid); | |
1224 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2); | |
1225 CheckReferencesVp9(pid + 4 , 0, pid); | |
1226 CheckReferencesVp9(pid + 5 , 0, pid + 2, pid + 3, pid + 4); | |
1227 CheckReferencesVp9(pid + 6 , 0, pid + 2, pid + 4); | |
1228 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6); | |
1229 CheckReferencesVp9(pid + 8 , 0, pid + 4); | |
1230 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1231 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1232 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10); | |
1233 CheckReferencesVp9(pid + 12, 0, pid + 8); | |
1234 CheckReferencesVp9(pid + 13, 0, pid + 12); | |
1235 CheckReferencesVp9(pid + 14, 0, pid + 12); | |
1236 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14); | |
1237 } | |
1238 | |
1239 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_01_0212) { | |
1240 uint16_t pid = Rand(); | |
1241 uint16_t sn = Rand(); | |
1242 GofInfoVP9 ss; | |
1243 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern | |
1244 | |
1245 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss | |
1246 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0); | |
1247 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss); | |
1248 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1); | |
1249 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 2); | |
1250 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern | |
1251 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2 , &ss); | |
1252 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1); | |
1253 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 2); | |
1254 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 3); | |
1255 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 3); | |
1256 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 2); | |
1257 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 3); | |
1258 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 3); | |
1259 | |
1260 ASSERT_EQ(12UL, frames_from_callback_.size()); | |
1261 CheckReferencesVp9(pid, 0); | |
1262 CheckReferencesVp9(pid + 1 , 0, pid); | |
1263 CheckReferencesVp9(pid + 2 , 0, pid); | |
1264 CheckReferencesVp9(pid + 3 , 0, pid + 2); | |
1265 CheckReferencesVp9(pid + 4 , 0, pid); | |
1266 CheckReferencesVp9(pid + 5 , 0, pid + 4); | |
1267 CheckReferencesVp9(pid + 6 , 0, pid + 4); | |
1268 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6); | |
1269 CheckReferencesVp9(pid + 8 , 0, pid + 4); | |
1270 CheckReferencesVp9(pid + 9 , 0, pid + 8); | |
1271 CheckReferencesVp9(pid + 10, 0, pid + 8); | |
1272 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10); | |
1273 } | |
1274 | |
1275 TEST_F(TestPacketBuffer, Vp9FlexibleModeOneFrame) { | |
1276 uint16_t pid = Rand(); | |
1277 uint16_t sn = Rand(); | |
1278 | |
1279 // sn, kf, frst, lst, intr, pid, sid, tid, tl0 | |
1280 InsertVp9Flex(sn, kT, kT , kT , kF , pid, 0 , 0 , 0); | |
1281 | |
1282 ASSERT_EQ(1UL, frames_from_callback_.size()); | |
1283 CheckReferencesVp9(pid, 0); | |
1284 } | |
1285 | |
1286 TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayers) { | |
1287 uint16_t pid = Rand(); | |
1288 uint16_t sn = Rand(); | |
1289 | |
1290 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs | |
1291 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0); | |
1292 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0); | |
1293 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1}); | |
1294 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2}); | |
1295 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1}); | |
1296 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1}); | |
1297 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2}); | |
1298 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1}); | |
1299 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1}); | |
1300 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2}); | |
1301 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1}); | |
1302 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1}); | |
1303 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2}); | |
1304 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1}); | |
1305 | |
1306 ASSERT_EQ(14UL, frames_from_callback_.size()); | |
1307 CheckReferencesVp9(pid , 0); | |
1308 CheckReferencesVp9(pid , 1); | |
1309 CheckReferencesVp9(pid + 1, 1, pid); | |
1310 CheckReferencesVp9(pid + 2, 0, pid); | |
1311 CheckReferencesVp9(pid + 2, 1, pid + 1); | |
1312 CheckReferencesVp9(pid + 3, 1, pid + 2); | |
1313 CheckReferencesVp9(pid + 4, 0, pid + 2); | |
1314 CheckReferencesVp9(pid + 4, 1, pid + 3); | |
1315 CheckReferencesVp9(pid + 5, 1, pid + 4); | |
1316 CheckReferencesVp9(pid + 6, 0, pid + 4); | |
1317 CheckReferencesVp9(pid + 6, 1, pid + 5); | |
1318 CheckReferencesVp9(pid + 7, 1, pid + 6); | |
1319 CheckReferencesVp9(pid + 8, 0, pid + 6); | |
1320 CheckReferencesVp9(pid + 8, 1, pid + 7); | |
1321 } | |
1322 | |
1323 TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayersReordered) { | |
1324 uint16_t pid = Rand(); | |
1325 uint16_t sn = Rand(); | |
1326 | |
1327 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs | |
1328 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0); | |
1329 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1}); | |
1330 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0); | |
1331 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1}); | |
1332 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1}); | |
1333 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2}); | |
1334 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1}); | |
1335 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2}); | |
1336 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1}); | |
1337 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2}); | |
1338 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1}); | |
1339 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1}); | |
1340 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1}); | |
1341 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2}); | |
1342 | |
1343 ASSERT_EQ(14UL, frames_from_callback_.size()); | |
1344 CheckReferencesVp9(pid , 0); | |
1345 CheckReferencesVp9(pid , 1); | |
1346 CheckReferencesVp9(pid + 1, 1, pid); | |
1347 CheckReferencesVp9(pid + 2, 0, pid); | |
1348 CheckReferencesVp9(pid + 2, 1, pid + 1); | |
1349 CheckReferencesVp9(pid + 3, 1, pid + 2); | |
1350 CheckReferencesVp9(pid + 4, 0, pid + 2); | |
1351 CheckReferencesVp9(pid + 4, 1, pid + 3); | |
1352 CheckReferencesVp9(pid + 5, 1, pid + 4); | |
1353 CheckReferencesVp9(pid + 6, 0, pid + 4); | |
1354 CheckReferencesVp9(pid + 6, 1, pid + 5); | |
1355 CheckReferencesVp9(pid + 7, 1, pid + 6); | |
1356 CheckReferencesVp9(pid + 8, 0, pid + 6); | |
1357 CheckReferencesVp9(pid + 8, 1, pid + 7); | |
729 } | 1358 } |
730 | 1359 |
731 } // namespace video_coding | 1360 } // namespace video_coding |
732 } // namespace webrtc | 1361 } // namespace webrtc |
OLD | NEW |