Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: webrtc/modules/video_coding/packet_buffer_unittest.cc

Issue 1903523003: Convert Vp9 Rtp headers to frame references. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback fixes. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 };
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
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
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
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 , kT, 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 , kT, 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 , kT, 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 , kF, pid + 13, 0 , 2 , 3);
1217 InsertVp9Gof(sn + 14, kF, kT , kT , kF, 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 + 3, pid + 4);
1227 CheckReferencesVp9(pid + 6 , 0, pid + 2, pid + 4);
1228 CheckReferencesVp9(pid + 7 , 0, 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 + 11, pid + 12);
1235 CheckReferencesVp9(pid + 14, 0, pid + 10, pid + 12);
1236 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1237 }
1238
1239 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersUpSwitchReordered_02120212) {
1240 uint16_t pid = Rand();
1241 uint16_t sn = Rand();
1242 GofInfoVP9 ss;
1243 ss.SetGofInfoVP9(kTemporalStructureMode4); // 02120212 pattern
1244
1245 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1246 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0);
1247 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1248 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1);
1249 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0);
1250 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1);
1251 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0);
1252 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1);
1253 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2);
1254 InsertVp9Gof(sn + 6 , kF, kT , kT , kT, pid + 6 , 0 , 1 , 1);
1255 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3);
1256 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2);
1257 InsertVp9Gof(sn + 8 , kF, kT , kT , kT, pid + 8 , 0 , 0 , 2);
1258 InsertVp9Gof(sn + 11, kF, kT , kT , kT, pid + 11, 0 , 2 , 2);
1259 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3);
1260 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3);
1261 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3);
1262
1263 ASSERT_EQ(16UL, frames_from_callback_.size());
1264 CheckReferencesVp9(pid, 0);
1265 CheckReferencesVp9(pid + 1 , 0, pid);
1266 CheckReferencesVp9(pid + 2 , 0, pid);
1267 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2);
1268 CheckReferencesVp9(pid + 4 , 0, pid);
1269 CheckReferencesVp9(pid + 5 , 0, pid + 3, pid + 4);
1270 CheckReferencesVp9(pid + 6 , 0, pid + 2, pid + 4);
1271 CheckReferencesVp9(pid + 7 , 0, pid + 6);
1272 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1273 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1274 CheckReferencesVp9(pid + 10, 0, pid + 8);
1275 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1276 CheckReferencesVp9(pid + 12, 0, pid + 8);
1277 CheckReferencesVp9(pid + 13, 0, pid + 11, pid + 12);
1278 CheckReferencesVp9(pid + 14, 0, pid + 10, pid + 12);
1279 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1280 }
1281
1282 TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_01_0212) {
1283 uint16_t pid = Rand();
1284 uint16_t sn = Rand();
1285 GofInfoVP9 ss;
1286 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern
1287
1288 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1289 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0);
1290 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1291 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1);
1292 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 2);
1293 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern
1294 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2 , &ss);
1295 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1);
1296 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 2);
1297 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 3);
1298 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 3);
1299 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 2);
1300 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 3);
1301 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 3);
1302
1303 ASSERT_EQ(12UL, frames_from_callback_.size());
1304 CheckReferencesVp9(pid, 0);
1305 CheckReferencesVp9(pid + 1 , 0, pid);
1306 CheckReferencesVp9(pid + 2 , 0, pid);
1307 CheckReferencesVp9(pid + 3 , 0, pid + 2);
1308 CheckReferencesVp9(pid + 4 , 0, pid);
1309 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1310 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1311 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6);
1312 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1313 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1314 CheckReferencesVp9(pid + 10, 0, pid + 8);
1315 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1316 }
1317
1318 TEST_F(TestPacketBuffer, Vp9FlexibleModeOneFrame) {
1319 uint16_t pid = Rand();
1320 uint16_t sn = Rand();
1321
1322 // sn, kf, frst, lst, intr, pid, sid, tid, tl0
1323 InsertVp9Flex(sn, kT, kT , kT , kF , pid, 0 , 0 , 0);
1324
1325 ASSERT_EQ(1UL, frames_from_callback_.size());
1326 CheckReferencesVp9(pid, 0);
1327 }
1328
1329 TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayers) {
1330 uint16_t pid = Rand();
1331 uint16_t sn = Rand();
1332
1333 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs
1334 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0);
1335 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0);
1336 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1});
1337 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2});
1338 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1});
1339 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1});
1340 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2});
1341 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1});
1342 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1});
1343 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2});
1344 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1});
1345 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1});
1346 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2});
1347 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1});
1348
1349 ASSERT_EQ(14UL, frames_from_callback_.size());
1350 CheckReferencesVp9(pid , 0);
1351 CheckReferencesVp9(pid , 1);
1352 CheckReferencesVp9(pid + 1, 1, pid);
1353 CheckReferencesVp9(pid + 2, 0, pid);
1354 CheckReferencesVp9(pid + 2, 1, pid + 1);
1355 CheckReferencesVp9(pid + 3, 1, pid + 2);
1356 CheckReferencesVp9(pid + 4, 0, pid + 2);
1357 CheckReferencesVp9(pid + 4, 1, pid + 3);
1358 CheckReferencesVp9(pid + 5, 1, pid + 4);
1359 CheckReferencesVp9(pid + 6, 0, pid + 4);
1360 CheckReferencesVp9(pid + 6, 1, pid + 5);
1361 CheckReferencesVp9(pid + 7, 1, pid + 6);
1362 CheckReferencesVp9(pid + 8, 0, pid + 6);
1363 CheckReferencesVp9(pid + 8, 1, pid + 7);
1364 }
1365
1366 TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayersReordered) {
1367 uint16_t pid = Rand();
1368 uint16_t sn = Rand();
1369
1370 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs
1371 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0);
1372 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1});
1373 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0);
1374 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1});
1375 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1});
1376 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2});
1377 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1});
1378 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2});
1379 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1});
1380 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2});
1381 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1});
1382 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1});
1383 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1});
1384 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2});
1385
1386 ASSERT_EQ(14UL, frames_from_callback_.size());
1387 CheckReferencesVp9(pid , 0);
1388 CheckReferencesVp9(pid , 1);
1389 CheckReferencesVp9(pid + 1, 1, pid);
1390 CheckReferencesVp9(pid + 2, 0, pid);
1391 CheckReferencesVp9(pid + 2, 1, pid + 1);
1392 CheckReferencesVp9(pid + 3, 1, pid + 2);
1393 CheckReferencesVp9(pid + 4, 0, pid + 2);
1394 CheckReferencesVp9(pid + 4, 1, pid + 3);
1395 CheckReferencesVp9(pid + 5, 1, pid + 4);
1396 CheckReferencesVp9(pid + 6, 0, pid + 4);
1397 CheckReferencesVp9(pid + 6, 1, pid + 5);
1398 CheckReferencesVp9(pid + 7, 1, pid + 6);
1399 CheckReferencesVp9(pid + 8, 0, pid + 6);
1400 CheckReferencesVp9(pid + 8, 1, pid + 7);
729 } 1401 }
730 1402
731 } // namespace video_coding 1403 } // namespace video_coding
732 } // namespace webrtc 1404 } // namespace webrtc
OLDNEW
« webrtc/modules/video_coding/packet_buffer.cc ('K') | « webrtc/modules/video_coding/packet_buffer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698