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

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

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

Powered by Google App Engine
This is Rietveld 408576698