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

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