blob: b50074d8f60d87ef34cd93b001111f213f996366 [file] [log] [blame]
philipelc707ab72016-04-01 02:01:54 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <cstring>
12#include <limits>
philipel02447bc2016-05-13 06:01:03 -070013#include <map>
14#include <set>
philipela1059872016-05-09 11:41:48 +020015#include <utility>
philipelc707ab72016-04-01 02:01:54 -070016
17#include "webrtc/modules/video_coding/frame_object.h"
18#include "webrtc/modules/video_coding/packet_buffer.h"
19
20#include "testing/gtest/include/gtest/gtest.h"
21#include "webrtc/base/random.h"
22
23namespace webrtc {
24namespace video_coding {
25
26class TestPacketBuffer : public ::testing::Test,
27 public OnCompleteFrameCallback {
28 protected:
29 TestPacketBuffer()
philipelf4139332016-04-20 10:26:34 +020030 : rand_(0x8739211),
philipela1059872016-05-09 11:41:48 +020031 packet_buffer_(new PacketBuffer(kStartSize, kMaxSize, this)),
32 frames_from_callback_(FrameComp()) {}
philipelc707ab72016-04-01 02:01:54 -070033
34 uint16_t Rand() { return rand_.Rand(std::numeric_limits<uint16_t>::max()); }
35
36 void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override {
philipelf4139332016-04-20 10:26:34 +020037 uint16_t pid = frame->picture_id;
philipela1059872016-05-09 11:41:48 +020038 uint16_t sidx = frame->spatial_layer;
39 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx));
philipelf4139332016-04-20 10:26:34 +020040 if (frame_it != frames_from_callback_.end()) {
philipela1059872016-05-09 11:41:48 +020041 ADD_FAILURE() << "Already received frame with (pid:sidx): ("
42 << pid << ":" << sidx << ")";
philipelf4139332016-04-20 10:26:34 +020043 return;
44 }
45
46 frames_from_callback_.insert(
philipela1059872016-05-09 11:41:48 +020047 std::make_pair(std::make_pair(pid, sidx), std::move(frame)));
philipelc707ab72016-04-01 02:01:54 -070048 }
49
50 void TearDown() override {
philipelf4139332016-04-20 10:26:34 +020051 // All frame objects must be destroyed before the packet buffer since
52 // a frame object will try to remove itself from the packet buffer
philipelc707ab72016-04-01 02:01:54 -070053 // upon destruction.
54 frames_from_callback_.clear();
55 }
56
philipela1059872016-05-09 11:41:48 +020057 // Short version of true and false.
58 enum {
59 kT = true,
60 kF = false
61 };
62
philipelf4139332016-04-20 10:26:34 +020063 // Insert a generic packet into the packet buffer.
64 void InsertGeneric(uint16_t seq_num, // packet sequence number
65 bool keyframe, // is keyframe
66 bool first, // is first packet of frame
67 bool last, // is last packet of frame
68 size_t data_size = 0, // size of data
69 uint8_t* data = nullptr) { // data pointer
70 VCMPacket packet;
71 packet.codec = kVideoCodecGeneric;
72 packet.seqNum = seq_num;
73 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
74 packet.isFirstPacket = first;
75 packet.markerBit = last;
76 packet.sizeBytes = data_size;
77 packet.dataPtr = data;
78
79 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
80 }
81
82 // Insert a Vp8 packet into the packet buffer.
83 void InsertVp8(uint16_t seq_num, // packet sequence number
84 bool keyframe, // is keyframe
85 bool first, // is first packet of frame
86 bool last, // is last packet of frame
87 bool sync = false, // is sync frame
88 int32_t pid = kNoPictureId, // picture id
89 uint8_t tid = kNoTemporalIdx, // temporal id
90 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index
91 size_t data_size = 0, // size of data
92 uint8_t* data = nullptr) { // data pointer
93 VCMPacket packet;
94 packet.codec = kVideoCodecVP8;
95 packet.seqNum = seq_num;
96 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
97 packet.isFirstPacket = first;
98 packet.markerBit = last;
99 packet.sizeBytes = data_size;
100 packet.dataPtr = data;
101 packet.codecSpecificHeader.codecHeader.VP8.pictureId = pid % (1 << 15);
102 packet.codecSpecificHeader.codecHeader.VP8.temporalIdx = tid;
103 packet.codecSpecificHeader.codecHeader.VP8.tl0PicIdx = tl0;
104 packet.codecSpecificHeader.codecHeader.VP8.layerSync = sync;
105
106 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
107 }
108
philipela1059872016-05-09 11:41:48 +0200109 // Insert a Vp9 packet into the packet buffer.
110 void InsertVp9Gof(uint16_t seq_num, // packet sequence number
111 bool keyframe, // is keyframe
112 bool first, // is first packet of frame
113 bool last, // is last packet of frame
114 bool up = false, // frame is up-switch point
115 int32_t pid = kNoPictureId, // picture id
116 uint8_t sid = kNoSpatialIdx, // spatial id
117 uint8_t tid = kNoTemporalIdx, // temporal id
118 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index
119 GofInfoVP9* ss = nullptr, // scalability structure
120 size_t data_size = 0, // size of data
121 uint8_t* data = nullptr) { // data pointer
122 VCMPacket packet;
123 packet.codec = kVideoCodecVP9;
124 packet.seqNum = seq_num;
125 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
126 packet.isFirstPacket = first;
127 packet.markerBit = last;
128 packet.sizeBytes = data_size;
129 packet.dataPtr = data;
130 packet.codecSpecificHeader.codecHeader.VP9.flexible_mode = false;
131 packet.codecSpecificHeader.codecHeader.VP9.picture_id = pid % (1 << 15);
132 packet.codecSpecificHeader.codecHeader.VP9.temporal_idx = tid;
133 packet.codecSpecificHeader.codecHeader.VP9.spatial_idx = sid;
134 packet.codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = tl0;
135 packet.codecSpecificHeader.codecHeader.VP9.temporal_up_switch = up;
136 if (ss != nullptr) {
137 packet.codecSpecificHeader.codecHeader.VP9.ss_data_available = true;
138 packet.codecSpecificHeader.codecHeader.VP9.gof = *ss;
139 }
140
141 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
142 }
143
144 // Insert a Vp9 packet into the packet buffer.
145 void InsertVp9Flex(uint16_t seq_num, // packet sequence number
146 bool keyframe, // is keyframe
147 bool first, // is first packet of frame
148 bool last, // is last packet of frame
149 bool inter, // depends on S-1 layer
150 int32_t pid = kNoPictureId, // picture id
151 uint8_t sid = kNoSpatialIdx, // spatial id
152 uint8_t tid = kNoTemporalIdx, // temporal id
153 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index
154 std::vector<uint8_t> refs =
155 std::vector<uint8_t>(), // frame references
156 size_t data_size = 0, // size of data
157 uint8_t* data = nullptr) { // data pointer
158 VCMPacket packet;
159 packet.codec = kVideoCodecVP9;
160 packet.seqNum = seq_num;
161 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
162 packet.isFirstPacket = first;
163 packet.markerBit = last;
164 packet.sizeBytes = data_size;
165 packet.dataPtr = data;
166 packet.codecSpecificHeader.codecHeader.VP9.inter_layer_predicted = inter;
167 packet.codecSpecificHeader.codecHeader.VP9.flexible_mode = true;
168 packet.codecSpecificHeader.codecHeader.VP9.picture_id = pid % (1 << 15);
169 packet.codecSpecificHeader.codecHeader.VP9.temporal_idx = tid;
170 packet.codecSpecificHeader.codecHeader.VP9.spatial_idx = sid;
171 packet.codecSpecificHeader.codecHeader.VP9.tl0_pic_idx = tl0;
172 packet.codecSpecificHeader.codecHeader.VP9.num_ref_pics = refs.size();
173 for (size_t i = 0; i < refs.size(); ++i)
174 packet.codecSpecificHeader.codecHeader.VP9.pid_diff[i] = refs[i];
175
176 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
177 }
178
179 // Check if a frame with picture id |pid| and spatial index |sidx| has been
180 // delivered from the packet buffer, and if so, if it has the references
181 // specified by |refs|.
philipelf4139332016-04-20 10:26:34 +0200182 template <typename... T>
philipela1059872016-05-09 11:41:48 +0200183 void CheckReferences(uint16_t pid, uint16_t sidx, T... refs) const {
184 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx));
philipelf4139332016-04-20 10:26:34 +0200185 if (frame_it == frames_from_callback_.end()) {
philipela1059872016-05-09 11:41:48 +0200186 ADD_FAILURE() << "Could not find frame with (pid:sidx): ("
187 << pid << ":" << sidx << ")";
philipelf4139332016-04-20 10:26:34 +0200188 return;
189 }
190
191 std::set<uint16_t> actual_refs;
192 for (uint8_t r = 0; r < frame_it->second->num_references; ++r) {
193 actual_refs.insert(frame_it->second->references[r]);
194 }
195
196 std::set<uint16_t> expected_refs;
197 RefsToSet(&expected_refs, refs...);
198
199 ASSERT_EQ(expected_refs, actual_refs);
200 }
201
202 template <typename... T>
philipela1059872016-05-09 11:41:48 +0200203 void CheckReferencesGeneric(uint16_t pid, T... refs) const {
204 CheckReferences(pid, 0, refs...);
205 }
206
207 template <typename... T>
208 void CheckReferencesVp8(uint16_t pid, T... refs) const {
209 CheckReferences(pid, 0, refs...);
210 }
211
212 template <typename... T>
213 void CheckReferencesVp9(uint16_t pid, uint8_t sidx, T... refs) const {
214 CheckReferences(pid, sidx, refs...);
215 }
216
217 template <typename... T>
philipelf4139332016-04-20 10:26:34 +0200218 void RefsToSet(std::set<uint16_t>* m, uint16_t ref, T... refs) const {
219 m->insert(ref);
220 RefsToSet(m, refs...);
221 }
222
223 void RefsToSet(std::set<uint16_t>* m) const {}
224
philipelc707ab72016-04-01 02:01:54 -0700225 const int kStartSize = 16;
226 const int kMaxSize = 64;
227
228 Random rand_;
philipelf4139332016-04-20 10:26:34 +0200229 std::unique_ptr<PacketBuffer> packet_buffer_;
philipela1059872016-05-09 11:41:48 +0200230 struct FrameComp {
231 bool operator()(const std::pair<uint16_t, uint8_t> f1,
232 const std::pair<uint16_t, uint8_t> f2) const {
233 if (f1.first == f2.first)
234 return f1.second < f2.second;
235 return f1.first < f2.first;
236 }
237 };
238 std::map<std::pair<uint16_t, uint8_t>,
239 std::unique_ptr<FrameObject>,
240 FrameComp> frames_from_callback_;
philipelc707ab72016-04-01 02:01:54 -0700241};
242
243TEST_F(TestPacketBuffer, InsertOnePacket) {
244 VCMPacket packet;
245 packet.seqNum = Rand();
philipelf4139332016-04-20 10:26:34 +0200246 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700247}
248
249TEST_F(TestPacketBuffer, InsertMultiplePackets) {
250 VCMPacket packet;
251 packet.seqNum = Rand();
philipelf4139332016-04-20 10:26:34 +0200252 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700253 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200254 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700255 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200256 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700257}
258
259TEST_F(TestPacketBuffer, InsertDuplicatePacket) {
260 VCMPacket packet;
261 packet.seqNum = Rand();
philipelf4139332016-04-20 10:26:34 +0200262 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700263 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200264 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
265 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700266}
267
268TEST_F(TestPacketBuffer, ExpandBuffer) {
philipelf4139332016-04-20 10:26:34 +0200269 uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700270
271 for (int i = 0; i < kStartSize + 1; ++i) {
philipela1059872016-05-09 11:41:48 +0200272 // seq_num , kf, frst, lst
273 InsertGeneric(seq_num + i, kT , kT, kT);
philipelc707ab72016-04-01 02:01:54 -0700274 }
275}
276
277TEST_F(TestPacketBuffer, ExpandBufferOverflow) {
philipelf4139332016-04-20 10:26:34 +0200278 uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700279
280 for (int i = 0; i < kMaxSize; ++i) {
philipela1059872016-05-09 11:41:48 +0200281 // seq_num , kf, frst, lst
282 InsertGeneric(seq_num + i, kT, kT , kT);
philipelc707ab72016-04-01 02:01:54 -0700283 }
284
philipelf4139332016-04-20 10:26:34 +0200285 VCMPacket packet;
286 packet.seqNum = seq_num + kMaxSize + 1;
287 packet.sizeBytes = 1;
288 EXPECT_FALSE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700289}
290
philipelf4139332016-04-20 10:26:34 +0200291TEST_F(TestPacketBuffer, GenericOnePacketOneFrame) {
philipela1059872016-05-09 11:41:48 +0200292 // seq_num, kf, frst, lst
293 InsertGeneric(Rand() , kT, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200294 ASSERT_EQ(1UL, frames_from_callback_.size());
philipelc707ab72016-04-01 02:01:54 -0700295}
296
philipelf4139332016-04-20 10:26:34 +0200297TEST_F(TestPacketBuffer, GenericTwoPacketsTwoFrames) {
298 uint16_t seq_num = Rand();
299
philipela1059872016-05-09 11:41:48 +0200300 // seq_num , kf, frst, lst
301 InsertGeneric(seq_num , kT, kT , kT);
302 InsertGeneric(seq_num + 1, kT, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200303
philipelc707ab72016-04-01 02:01:54 -0700304 EXPECT_EQ(2UL, frames_from_callback_.size());
305}
306
philipelf4139332016-04-20 10:26:34 +0200307TEST_F(TestPacketBuffer, GenericTwoPacketsOneFrames) {
308 uint16_t seq_num = Rand();
309
philipela1059872016-05-09 11:41:48 +0200310 // seq_num , kf, frst, lst
311 InsertGeneric(seq_num , kT, kT , kF);
312 InsertGeneric(seq_num + 1, kT, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200313
philipelc707ab72016-04-01 02:01:54 -0700314 EXPECT_EQ(1UL, frames_from_callback_.size());
315}
316
philipelf4139332016-04-20 10:26:34 +0200317TEST_F(TestPacketBuffer, GenericThreePacketReorderingOneFrame) {
318 uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700319
philipela1059872016-05-09 11:41:48 +0200320 // seq_num , kf, frst, lst
321 InsertGeneric(seq_num , kT, kT , kF);
322 InsertGeneric(seq_num + 2, kT, kF , kT);
323 InsertGeneric(seq_num + 1, kT, kF , kF);
philipelf4139332016-04-20 10:26:34 +0200324
philipelc707ab72016-04-01 02:01:54 -0700325 EXPECT_EQ(1UL, frames_from_callback_.size());
326}
327
328TEST_F(TestPacketBuffer, DiscardOldPacket) {
329 uint16_t seq_num = Rand();
330 VCMPacket packet;
331 packet.seqNum = Rand();
philipelf4139332016-04-20 10:26:34 +0200332 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700333 packet.seqNum += 2;
philipelf4139332016-04-20 10:26:34 +0200334 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700335
336 for (int i = 3; i < kMaxSize; ++i) {
337 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200338 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700339 }
340
341 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200342 EXPECT_FALSE(packet_buffer_->InsertPacket(packet));
343 packet_buffer_->ClearTo(seq_num + 1);
344 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700345}
346
347TEST_F(TestPacketBuffer, DiscardMultipleOldPackets) {
348 uint16_t seq_num = Rand();
349 VCMPacket packet;
350 packet.seqNum = seq_num;
philipelf4139332016-04-20 10:26:34 +0200351 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700352 packet.seqNum += 2;
philipelf4139332016-04-20 10:26:34 +0200353 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700354
355 for (int i = 3; i < kMaxSize; ++i) {
356 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200357 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700358 }
359
philipelf4139332016-04-20 10:26:34 +0200360 packet_buffer_->ClearTo(seq_num + 15);
philipelc707ab72016-04-01 02:01:54 -0700361 for (int i = 0; i < 15; ++i) {
362 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200363 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700364 }
365 for (int i = 15; i < kMaxSize; ++i) {
366 ++packet.seqNum;
philipelf4139332016-04-20 10:26:34 +0200367 EXPECT_FALSE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700368 }
369}
370
philipelf4139332016-04-20 10:26:34 +0200371TEST_F(TestPacketBuffer, GenericFrames) {
372 uint16_t seq_num = Rand();
373
374 // seq_num , keyf , first, last
375 InsertGeneric(seq_num , true , true , true);
376 InsertGeneric(seq_num + 1, false, true , true);
377 InsertGeneric(seq_num + 2, false, true , true);
378 InsertGeneric(seq_num + 3, false, true , true);
379
380 ASSERT_EQ(4UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200381 CheckReferencesGeneric(seq_num);
382 CheckReferencesGeneric(seq_num + 1, seq_num);
383 CheckReferencesGeneric(seq_num + 2, seq_num + 1);
384 CheckReferencesGeneric(seq_num + 3, seq_num + 2);
philipelf4139332016-04-20 10:26:34 +0200385}
386
387TEST_F(TestPacketBuffer, GenericFramesReordered) {
388 uint16_t seq_num = Rand();
389
390 // seq_num , keyf , first, last
391 InsertGeneric(seq_num + 1, false, true , true);
392 InsertGeneric(seq_num , true , true , true);
393 InsertGeneric(seq_num + 3, false, true , true);
394 InsertGeneric(seq_num + 2, false, true , true);
395
396 ASSERT_EQ(4UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200397 CheckReferencesGeneric(seq_num);
398 CheckReferencesGeneric(seq_num + 1, seq_num);
399 CheckReferencesGeneric(seq_num + 2, seq_num + 1);
400 CheckReferencesGeneric(seq_num + 3, seq_num + 2);
philipelf4139332016-04-20 10:26:34 +0200401}
402
philipelc707ab72016-04-01 02:01:54 -0700403TEST_F(TestPacketBuffer, GetBitstreamFromFrame) {
404 // "many bitstream, such data" with null termination.
405 uint8_t many[] = {0x6d, 0x61, 0x6e, 0x79, 0x20};
406 uint8_t bitstream[] = {0x62, 0x69, 0x74, 0x73, 0x74, 0x72,
407 0x65, 0x61, 0x6d, 0x2c, 0x20};
408 uint8_t such[] = {0x73, 0x75, 0x63, 0x68, 0x20};
409 uint8_t data[] = {0x64, 0x61, 0x74, 0x61, 0x0};
410 uint8_t
411 result[sizeof(many) + sizeof(bitstream) + sizeof(such) + sizeof(data)];
412
philipelf4139332016-04-20 10:26:34 +0200413 uint16_t seq_num = Rand();
philipelc707ab72016-04-01 02:01:54 -0700414
philipela1059872016-05-09 11:41:48 +0200415 // seq_num , kf, frst, lst, data_size , data
416 InsertGeneric(seq_num , kT, kT , kF , sizeof(many) , many);
417 InsertGeneric(seq_num + 1, kF, kF , kF , sizeof(bitstream), bitstream);
418 InsertGeneric(seq_num + 2, kF, kF , kF , sizeof(such) , such);
419 InsertGeneric(seq_num + 3, kF, kF , kT , sizeof(data) , data);
philipelf4139332016-04-20 10:26:34 +0200420
421 ASSERT_EQ(1UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200422 CheckReferencesVp8(seq_num + 3);
423 EXPECT_TRUE(frames_from_callback_[std::make_pair(seq_num + 3, 0)]->
424 GetBitstream(result));
philipelf4139332016-04-20 10:26:34 +0200425 EXPECT_EQ(std::strcmp("many bitstream, such data",
426 reinterpret_cast<char*>(result)),
427 0);
philipelc707ab72016-04-01 02:01:54 -0700428}
429
430TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) {
philipelf4139332016-04-20 10:26:34 +0200431 uint16_t seq_num = Rand();
432
philipela1059872016-05-09 11:41:48 +0200433 // seq_num , kf, frst, lst
434 InsertGeneric(seq_num , kT, kT , kF);
435 InsertGeneric(seq_num + 1, kF, kF , kF);
436 InsertGeneric(seq_num + 2, kF, kF , kT);
philipelc707ab72016-04-01 02:01:54 -0700437 EXPECT_EQ(1UL, frames_from_callback_.size());
438
439 frames_from_callback_.clear();
440
philipela1059872016-05-09 11:41:48 +0200441 // seq_num , kf, frst, lst
442 InsertGeneric(seq_num , kT, kT , kF);
443 InsertGeneric(seq_num + 1, kF, kF , kF);
444 InsertGeneric(seq_num + 2, kF, kF , kT);
philipelc707ab72016-04-01 02:01:54 -0700445 EXPECT_EQ(1UL, frames_from_callback_.size());
446}
447
philipel02447bc2016-05-13 06:01:03 -0700448TEST_F(TestPacketBuffer, Clear) {
philipelf4139332016-04-20 10:26:34 +0200449 uint16_t seq_num = Rand();
450
philipela1059872016-05-09 11:41:48 +0200451 // seq_num , kf, frst, lst
452 InsertGeneric(seq_num , kT, kT , kF);
453 InsertGeneric(seq_num + 1, kF, kF , kF);
454 InsertGeneric(seq_num + 2, kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200455 EXPECT_EQ(1UL, frames_from_callback_.size());
456
philipel02447bc2016-05-13 06:01:03 -0700457 packet_buffer_->Clear();
philipelf4139332016-04-20 10:26:34 +0200458
philipela1059872016-05-09 11:41:48 +0200459 // seq_num , kf, frst, lst
460 InsertGeneric(seq_num + kStartSize , kT, kT , kF);
461 InsertGeneric(seq_num + kStartSize + 1, kF, kF , kF);
462 InsertGeneric(seq_num + kStartSize + 2, kF, kF , kT);
philipelc707ab72016-04-01 02:01:54 -0700463 EXPECT_EQ(2UL, frames_from_callback_.size());
464}
465
philipel02447bc2016-05-13 06:01:03 -0700466TEST_F(TestPacketBuffer, InvalidateFrameByClearing) {
philipelc707ab72016-04-01 02:01:54 -0700467 VCMPacket packet;
philipelf4139332016-04-20 10:26:34 +0200468 packet.codec = kVideoCodecGeneric;
469 packet.frameType = kVideoFrameKey;
philipela1059872016-05-09 11:41:48 +0200470 packet.isFirstPacket = kT;
471 packet.markerBit = kT;
philipelc707ab72016-04-01 02:01:54 -0700472 packet.seqNum = Rand();
philipelf4139332016-04-20 10:26:34 +0200473 EXPECT_TRUE(packet_buffer_->InsertPacket(packet));
philipelc707ab72016-04-01 02:01:54 -0700474 ASSERT_EQ(1UL, frames_from_callback_.size());
475
philipel02447bc2016-05-13 06:01:03 -0700476 packet_buffer_->Clear();
philipelf4139332016-04-20 10:26:34 +0200477 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr));
478}
479
480TEST_F(TestPacketBuffer, Vp8NoPictureId) {
481 uint16_t seq_num = Rand();
482
philipela1059872016-05-09 11:41:48 +0200483 // seq_num , kf, frst, lst
484 InsertVp8(seq_num , kT, kT , kF);
485 InsertVp8(seq_num + 1 , kF, kF , kF);
486 InsertVp8(seq_num + 2 , kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200487 ASSERT_EQ(1UL, frames_from_callback_.size());
488
philipela1059872016-05-09 11:41:48 +0200489 InsertVp8(seq_num + 3 , kF, kT , kF);
490 InsertVp8(seq_num + 4 , kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200491 ASSERT_EQ(2UL, frames_from_callback_.size());
492
philipela1059872016-05-09 11:41:48 +0200493 InsertVp8(seq_num + 5 , kF, kT , kF);
494 InsertVp8(seq_num + 6 , kF, kF , kF);
495 InsertVp8(seq_num + 7 , kF, kF , kF);
496 InsertVp8(seq_num + 8 , kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200497 ASSERT_EQ(3UL, frames_from_callback_.size());
498
philipela1059872016-05-09 11:41:48 +0200499 InsertVp8(seq_num + 9 , kF, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200500 ASSERT_EQ(4UL, frames_from_callback_.size());
501
philipela1059872016-05-09 11:41:48 +0200502 InsertVp8(seq_num + 10, kF, kT , kF);
503 InsertVp8(seq_num + 11, kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200504 ASSERT_EQ(5UL, frames_from_callback_.size());
505
philipela1059872016-05-09 11:41:48 +0200506 InsertVp8(seq_num + 12, kT, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200507 ASSERT_EQ(6UL, frames_from_callback_.size());
508
philipela1059872016-05-09 11:41:48 +0200509 InsertVp8(seq_num + 13, kF, kT , kF);
510 InsertVp8(seq_num + 14, kF, kF , kF);
511 InsertVp8(seq_num + 15, kF, kF , kF);
512 InsertVp8(seq_num + 16, kF, kF , kF);
513 InsertVp8(seq_num + 17, kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200514 ASSERT_EQ(7UL, frames_from_callback_.size());
515
philipela1059872016-05-09 11:41:48 +0200516 InsertVp8(seq_num + 18, kF, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200517 ASSERT_EQ(8UL, frames_from_callback_.size());
518
philipela1059872016-05-09 11:41:48 +0200519 InsertVp8(seq_num + 19, kF, kT , kF);
520 InsertVp8(seq_num + 20, kF, kF , kT);
philipelf4139332016-04-20 10:26:34 +0200521 ASSERT_EQ(9UL, frames_from_callback_.size());
522
philipela1059872016-05-09 11:41:48 +0200523 InsertVp8(seq_num + 21, kF, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200524
525 ASSERT_EQ(10UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200526 CheckReferencesVp8(seq_num + 2);
527 CheckReferencesVp8(seq_num + 4, seq_num + 2);
528 CheckReferencesVp8(seq_num + 8, seq_num + 4);
529 CheckReferencesVp8(seq_num + 9, seq_num + 8);
530 CheckReferencesVp8(seq_num + 11, seq_num + 9);
531 CheckReferencesVp8(seq_num + 12);
532 CheckReferencesVp8(seq_num + 17, seq_num + 12);
533 CheckReferencesVp8(seq_num + 18, seq_num + 17);
534 CheckReferencesVp8(seq_num + 20, seq_num + 18);
535 CheckReferencesVp8(seq_num + 21, seq_num + 20);
philipelf4139332016-04-20 10:26:34 +0200536}
537
538TEST_F(TestPacketBuffer, Vp8NoPictureIdReordered) {
539 uint16_t seq_num = 0xfffa;
540
philipela1059872016-05-09 11:41:48 +0200541 // seq_num , kf, frst, lst
542 InsertVp8(seq_num + 1 , kF, kF , kF);
543 InsertVp8(seq_num , kT, kT , kF);
544 InsertVp8(seq_num + 2 , kF, kF , kT);
545 InsertVp8(seq_num + 4 , kF, kF , kT);
546 InsertVp8(seq_num + 6 , kF, kF , kF);
547 InsertVp8(seq_num + 3 , kF, kT , kF);
548 InsertVp8(seq_num + 7 , kF, kF , kF);
549 InsertVp8(seq_num + 5 , kF, kT , kF);
550 InsertVp8(seq_num + 9 , kF, kT , kT);
551 InsertVp8(seq_num + 10, kF, kT , kF);
552 InsertVp8(seq_num + 8 , kF, kF , kT);
553 InsertVp8(seq_num + 13, kF, kT , kF);
554 InsertVp8(seq_num + 14, kF, kF , kF);
555 InsertVp8(seq_num + 12, kT, kT , kT);
556 InsertVp8(seq_num + 11, kF, kF , kT);
557 InsertVp8(seq_num + 16, kF, kF , kF);
558 InsertVp8(seq_num + 19, kF, kT , kF);
559 InsertVp8(seq_num + 15, kF, kF , kF);
560 InsertVp8(seq_num + 17, kF, kF , kT);
561 InsertVp8(seq_num + 20, kF, kF , kT);
562 InsertVp8(seq_num + 21, kF, kT , kT);
563 InsertVp8(seq_num + 18, kF, kT , kT);
philipelf4139332016-04-20 10:26:34 +0200564
565 ASSERT_EQ(10UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200566 CheckReferencesVp8(seq_num + 2);
567 CheckReferencesVp8(seq_num + 4, seq_num + 2);
568 CheckReferencesVp8(seq_num + 8, seq_num + 4);
569 CheckReferencesVp8(seq_num + 9, seq_num + 8);
570 CheckReferencesVp8(seq_num + 11, seq_num + 9);
571 CheckReferencesVp8(seq_num + 12);
572 CheckReferencesVp8(seq_num + 17, seq_num + 12);
573 CheckReferencesVp8(seq_num + 18, seq_num + 17);
574 CheckReferencesVp8(seq_num + 20, seq_num + 18);
575 CheckReferencesVp8(seq_num + 21, seq_num + 20);
philipelf4139332016-04-20 10:26:34 +0200576}
577
578
579TEST_F(TestPacketBuffer, Vp8KeyFrameReferences) {
580 uint16_t pid = Rand();
philipela1059872016-05-09 11:41:48 +0200581 // seq_num, kf, frst, lst, sync, pid, tid, tl0
582 InsertVp8(Rand() , kT, kT , kT , kF , pid, 0 , 0);
philipelf4139332016-04-20 10:26:34 +0200583
584 ASSERT_EQ(1UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200585 CheckReferencesVp8(pid);
philipelf4139332016-04-20 10:26:34 +0200586}
587
588// Test with 1 temporal layer.
589TEST_F(TestPacketBuffer, Vp8TemporalLayers_0) {
590 uint16_t pid = Rand();
591 uint16_t seq_num = Rand();
592
philipela1059872016-05-09 11:41:48 +0200593 // seq_num , kf, frst, lst, sync, pid , tid, tl0
594 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 1);
595 InsertVp8(seq_num + 1, kF, kT , kT , kF , pid + 1, 0 , 2);
596 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 3);
597 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 0 , 4);
philipelf4139332016-04-20 10:26:34 +0200598
599 ASSERT_EQ(4UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200600 CheckReferencesVp8(pid);
601 CheckReferencesVp8(pid + 1, pid);
602 CheckReferencesVp8(pid + 2, pid + 1);
603 CheckReferencesVp8(pid + 3, pid + 2);
philipelf4139332016-04-20 10:26:34 +0200604}
605
606// Test with 1 temporal layer.
607TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0) {
608 uint16_t pid = Rand();
609 uint16_t seq_num = Rand();
610
philipela1059872016-05-09 11:41:48 +0200611 // seq_num , kf, frst, lst, sync, pid , tid, tl0
612 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 1);
613 InsertVp8(seq_num + 1, kF, kT , kT , kF , pid + 1, 0 , 2);
614 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 0 , 4);
615 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 3);
616 InsertVp8(seq_num + 5, kF, kT , kT , kF , pid + 5, 0 , 6);
617 InsertVp8(seq_num + 6, kF, kT , kT , kF , pid + 6, 0 , 7);
618 InsertVp8(seq_num + 4, kF, kT , kT , kF , pid + 4, 0 , 5);
philipelf4139332016-04-20 10:26:34 +0200619
620 ASSERT_EQ(7UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200621 CheckReferencesVp8(pid);
622 CheckReferencesVp8(pid + 1, pid);
623 CheckReferencesVp8(pid + 2, pid + 1);
624 CheckReferencesVp8(pid + 3, pid + 2);
625 CheckReferencesVp8(pid + 4, pid + 3);
626 CheckReferencesVp8(pid + 5, pid + 4);
627 CheckReferencesVp8(pid + 6, pid + 5);
philipelf4139332016-04-20 10:26:34 +0200628}
629
630// Test with 2 temporal layers in a 01 pattern.
631TEST_F(TestPacketBuffer, Vp8TemporalLayers_01) {
632 uint16_t pid = Rand();
633 uint16_t seq_num = Rand();
634
philipela1059872016-05-09 11:41:48 +0200635 // seq_num , kf, frst, lst, sync, pid , tid, tl0
636 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0, 255);
637 InsertVp8(seq_num + 1, kF, kT , kT , kT , pid + 1, 1, 255);
638 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0, 0);
639 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 1, 0);
philipelf4139332016-04-20 10:26:34 +0200640
641 ASSERT_EQ(4UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200642 CheckReferencesVp8(pid);
643 CheckReferencesVp8(pid + 1, pid);
644 CheckReferencesVp8(pid + 2, pid);
645 CheckReferencesVp8(pid + 3, pid + 1, pid + 2);
philipelf4139332016-04-20 10:26:34 +0200646}
647
648// Test with 2 temporal layers in a 01 pattern.
649TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_01) {
650 uint16_t pid = Rand();
651 uint16_t seq_num = Rand();
652
philipela1059872016-05-09 11:41:48 +0200653 // seq_num , kf, frst, lst, sync, pid , tid, tl0
654 InsertVp8(seq_num + 1, kF, kT , kT , kT , pid + 1, 1 , 255);
655 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 255);
656 InsertVp8(seq_num + 3, kF, kT , kT , kF , pid + 3, 1 , 0);
657 InsertVp8(seq_num + 5, kF, kT , kT , kF , pid + 5, 1 , 1);
658 InsertVp8(seq_num + 2, kF, kT , kT , kF , pid + 2, 0 , 0);
659 InsertVp8(seq_num + 4, kF, kT , kT , kF , pid + 4, 0 , 1);
660 InsertVp8(seq_num + 6, kF, kT , kT , kF , pid + 6, 0 , 2);
661 InsertVp8(seq_num + 7, kF, kT , kT , kF , pid + 7, 1 , 2);
philipelf4139332016-04-20 10:26:34 +0200662
663 ASSERT_EQ(8UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200664 CheckReferencesVp8(pid);
665 CheckReferencesVp8(pid + 1, pid);
666 CheckReferencesVp8(pid + 2, pid);
667 CheckReferencesVp8(pid + 3, pid + 1, pid + 2);
668 CheckReferencesVp8(pid + 4, pid + 2);
669 CheckReferencesVp8(pid + 5, pid + 3, pid + 4);
670 CheckReferencesVp8(pid + 6, pid + 4);
671 CheckReferencesVp8(pid + 7, pid + 5, pid + 6);
philipelf4139332016-04-20 10:26:34 +0200672}
673
674// Test with 3 temporal layers in a 0212 pattern.
675TEST_F(TestPacketBuffer, Vp8TemporalLayers_0212) {
676 uint16_t pid = Rand();
677 uint16_t seq_num = Rand();
678
philipela1059872016-05-09 11:41:48 +0200679 // seq_num , kf, frst, lst, sync, pid , tid, tl0
680 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 55);
681 InsertVp8(seq_num + 1 , kF, kT , kT , kT , pid + 1 , 2 , 55);
682 InsertVp8(seq_num + 2 , kF, kT , kT , kT , pid + 2 , 1 , 55);
683 InsertVp8(seq_num + 3 , kF, kT , kT , kF , pid + 3 , 2 , 55);
684 InsertVp8(seq_num + 4 , kF, kT , kT , kF , pid + 4 , 0 , 56);
685 InsertVp8(seq_num + 5 , kF, kT , kT , kF , pid + 5 , 2 , 56);
686 InsertVp8(seq_num + 6 , kF, kT , kT , kF , pid + 6 , 1 , 56);
687 InsertVp8(seq_num + 7 , kF, kT , kT , kF , pid + 7 , 2 , 56);
688 InsertVp8(seq_num + 8 , kF, kT , kT , kF , pid + 8 , 0 , 57);
689 InsertVp8(seq_num + 9 , kF, kT , kT , kT , pid + 9 , 2 , 57);
690 InsertVp8(seq_num + 10, kF, kT , kT , kT , pid + 10, 1 , 57);
691 InsertVp8(seq_num + 11, kF, kT , kT , kF , pid + 11, 2 , 57);
philipelf4139332016-04-20 10:26:34 +0200692
693 ASSERT_EQ(12UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200694 CheckReferencesVp8(pid);
695 CheckReferencesVp8(pid + 1 , pid);
696 CheckReferencesVp8(pid + 2 , pid);
697 CheckReferencesVp8(pid + 3 , pid, pid + 1, pid + 2);
698 CheckReferencesVp8(pid + 4 , pid);
699 CheckReferencesVp8(pid + 5 , pid + 2, pid + 3, pid + 4);
700 CheckReferencesVp8(pid + 6 , pid + 2, pid + 4);
701 CheckReferencesVp8(pid + 7 , pid + 4, pid + 5, pid + 6);
702 CheckReferencesVp8(pid + 8 , pid + 4);
703 CheckReferencesVp8(pid + 9 , pid + 8);
704 CheckReferencesVp8(pid + 10, pid + 8);
705 CheckReferencesVp8(pid + 11, pid + 8, pid + 9, pid + 10);
philipelf4139332016-04-20 10:26:34 +0200706}
707
708// Test with 3 temporal layers in a 0212 pattern.
709TEST_F(TestPacketBuffer, Vp8TemporalLayersReordering_0212) {
710 uint16_t pid = 126;
711 uint16_t seq_num = Rand();
712
philipela1059872016-05-09 11:41:48 +0200713 // seq_num , kf, frst, lst, sync, pid , tid, tl0
714 InsertVp8(seq_num + 1 , kF, kT , kT , kT , pid + 1 , 2 , 55);
715 InsertVp8(seq_num , kT, kT , kT , kF , pid , 0 , 55);
716 InsertVp8(seq_num + 2 , kF, kT , kT , kT , pid + 2 , 1 , 55);
717 InsertVp8(seq_num + 4 , kF, kT , kT , kF , pid + 4 , 0 , 56);
718 InsertVp8(seq_num + 5 , kF, kT , kT , kF , pid + 5 , 2 , 56);
719 InsertVp8(seq_num + 3 , kF, kT , kT , kF , pid + 3 , 2 , 55);
720 InsertVp8(seq_num + 7 , kF, kT , kT , kF , pid + 7 , 2 , 56);
721 InsertVp8(seq_num + 9 , kF, kT , kT , kT , pid + 9 , 2 , 57);
722 InsertVp8(seq_num + 6 , kF, kT , kT , kF , pid + 6 , 1 , 56);
723 InsertVp8(seq_num + 8 , kF, kT , kT , kF , pid + 8 , 0 , 57);
724 InsertVp8(seq_num + 11, kF, kT , kT , kF , pid + 11, 2 , 57);
725 InsertVp8(seq_num + 10, kF, kT , kT , kT , pid + 10, 1 , 57);
philipelf4139332016-04-20 10:26:34 +0200726
727 ASSERT_EQ(12UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200728 CheckReferencesVp8(pid);
729 CheckReferencesVp8(pid + 1 , pid);
730 CheckReferencesVp8(pid + 2 , pid);
731 CheckReferencesVp8(pid + 3 , pid, pid + 1, pid + 2);
732 CheckReferencesVp8(pid + 4 , pid);
733 CheckReferencesVp8(pid + 5 , pid + 2, pid + 3, pid + 4);
734 CheckReferencesVp8(pid + 6 , pid + 2, pid + 4);
735 CheckReferencesVp8(pid + 7 , pid + 4, pid + 5, pid + 6);
736 CheckReferencesVp8(pid + 8 , pid + 4);
737 CheckReferencesVp8(pid + 9 , pid + 8);
738 CheckReferencesVp8(pid + 10, pid + 8);
739 CheckReferencesVp8(pid + 11, pid + 8, pid + 9, pid + 10);
philipelf4139332016-04-20 10:26:34 +0200740}
741
742TEST_F(TestPacketBuffer, Vp8InsertManyFrames_0212) {
743 uint16_t pid = Rand();
744 uint16_t seq_num = Rand();
745
746 const int keyframes_to_insert = 50;
747 const int frames_per_keyframe = 120; // Should be a multiple of 4.
748 uint8_t tl0 = 128;
749
750 for (int k = 0; k < keyframes_to_insert; ++k) {
philipela1059872016-05-09 11:41:48 +0200751 // seq_num , keyf, frst, lst, sync, pid , tid, tl0
752 InsertVp8(seq_num , kT , kT , kT , kF , pid , 0 , tl0);
753 InsertVp8(seq_num + 1, kF , kT , kT , kT , pid + 1, 2 , tl0);
754 InsertVp8(seq_num + 2, kF , kT , kT , kT , pid + 2, 1 , tl0);
755 InsertVp8(seq_num + 3, kF , kT , kT , kF , pid + 3, 2 , tl0);
756 CheckReferencesVp8(pid);
757 CheckReferencesVp8(pid + 1, pid);
758 CheckReferencesVp8(pid + 2, pid);
759 CheckReferencesVp8(pid + 3, pid, pid + 1, pid + 2);
philipelf4139332016-04-20 10:26:34 +0200760 frames_from_callback_.clear();
761 ++tl0;
762
763 for (int f = 4; f < frames_per_keyframe; f += 4) {
764 uint16_t sf = seq_num + f;
765 uint16_t pidf = pid + f;
766
philipela1059872016-05-09 11:41:48 +0200767 // seq_num, keyf, frst, lst, sync, pid , tid, tl0
768 InsertVp8(sf , kF , kT , kT , kF , pidf , 0 , tl0);
769 InsertVp8(sf + 1 , kF , kT , kT , kF , pidf + 1, 2 , tl0);
770 InsertVp8(sf + 2 , kF , kT , kT , kF , pidf + 2, 1 , tl0);
771 InsertVp8(sf + 3 , kF , kT , kT , kF , pidf + 3, 2 , tl0);
772 CheckReferencesVp8(pidf, pidf - 4);
773 CheckReferencesVp8(pidf + 1, pidf, pidf - 1, pidf - 2);
774 CheckReferencesVp8(pidf + 2, pidf, pidf - 2);
775 CheckReferencesVp8(pidf + 3, pidf, pidf + 1, pidf + 2);
philipelf4139332016-04-20 10:26:34 +0200776 frames_from_callback_.clear();
777 ++tl0;
778 }
779
780 pid += frames_per_keyframe;
781 seq_num += frames_per_keyframe;
782 }
783}
784
785TEST_F(TestPacketBuffer, Vp8LayerSync) {
786 uint16_t pid = Rand();
787 uint16_t seq_num = Rand();
788
philipela1059872016-05-09 11:41:48 +0200789 // seq_num , keyf, frst, lst, sync, pid , tid, tl0
790 InsertVp8(seq_num , kT , kT , kT , kF , pid , 0 , 0);
791 InsertVp8(seq_num + 1 , kF , kT , kT , kT , pid + 1 , 1 , 0);
792 InsertVp8(seq_num + 2 , kF , kT , kT , kF , pid + 2 , 0 , 1);
philipelf4139332016-04-20 10:26:34 +0200793 ASSERT_EQ(3UL, frames_from_callback_.size());
794
philipela1059872016-05-09 11:41:48 +0200795 InsertVp8(seq_num + 4 , kF , kT , kT , kF , pid + 4 , 0 , 2);
796 InsertVp8(seq_num + 5 , kF , kT , kT , kT , pid + 5 , 1 , 2);
797 InsertVp8(seq_num + 6 , kF , kT , kT , kF , pid + 6 , 0 , 3);
798 InsertVp8(seq_num + 7 , kF , kT , kT , kF , pid + 7 , 1 , 3);
philipelf4139332016-04-20 10:26:34 +0200799
800 ASSERT_EQ(7UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200801 CheckReferencesVp8(pid);
802 CheckReferencesVp8(pid + 1, pid);
803 CheckReferencesVp8(pid + 2, pid);
804 CheckReferencesVp8(pid + 4, pid + 2);
805 CheckReferencesVp8(pid + 5, pid + 4);
806 CheckReferencesVp8(pid + 6, pid + 4);
807 CheckReferencesVp8(pid + 7, pid + 6, pid + 5);
philipelf4139332016-04-20 10:26:34 +0200808}
809
810TEST_F(TestPacketBuffer, Vp8InsertLargeFrames) {
811 packet_buffer_.reset(new PacketBuffer(1 << 3, 1 << 12, this));
812 uint16_t pid = Rand();
813 uint16_t seq_num = Rand();
814
815 const uint16_t packets_per_frame = 1000;
816 uint16_t current = seq_num;
817 uint16_t end = current + packets_per_frame;
818
philipela1059872016-05-09 11:41:48 +0200819 // seq_num , keyf, frst, lst, sync, pid, tid, tl0
820 InsertVp8(current++, kT , kT , kF , kF , pid, 0 , 0);
philipelf4139332016-04-20 10:26:34 +0200821 while (current != end)
philipela1059872016-05-09 11:41:48 +0200822 InsertVp8(current++, kF , kF , kF , kF , pid, 0 , 0);
823 InsertVp8(current++, kF , kF , kT , kF , pid, 0 , 0);
philipelf4139332016-04-20 10:26:34 +0200824 end = current + packets_per_frame;
825
826 for (int f = 1; f < 4; ++f) {
philipela1059872016-05-09 11:41:48 +0200827 InsertVp8(current++, kF , kT , kF , kF , pid + f, 0, f);
philipelf4139332016-04-20 10:26:34 +0200828 while (current != end)
philipela1059872016-05-09 11:41:48 +0200829 InsertVp8(current++, kF , kF , kF , kF , pid + f, 0, f);
830 InsertVp8(current++, kF , kF , kT , kF , pid + f, 0, f);
philipelf4139332016-04-20 10:26:34 +0200831 end = current + packets_per_frame;
832 }
833
834 ASSERT_EQ(4UL, frames_from_callback_.size());
philipela1059872016-05-09 11:41:48 +0200835 CheckReferencesVp8(pid);
836 CheckReferencesVp8(pid + 1, pid);
837 CheckReferencesVp8(pid + 2, pid + 1);
838 CheckReferencesVp8(pid + 3, pid + 2);
839}
840
841TEST_F(TestPacketBuffer, Vp9GofInsertOneFrame) {
842 uint16_t pid = Rand();
843 uint16_t seq_num = Rand();
844 GofInfoVP9 ss;
845 ss.SetGofInfoVP9(kTemporalStructureMode1);
846
847 // seq_num, keyf, frst, lst, up, pid, sid, tid, tl0, ss
848 InsertVp9Gof(seq_num, kT , kT , kT , kF, pid, 0 , 0 , 0 , &ss);
849
850 CheckReferencesVp9(pid, 0);
851}
852
853TEST_F(TestPacketBuffer, Vp9NoPictureIdReordered) {
854 uint16_t sn = 0xfffa;
855
856 // sn , kf, frst, lst
857 InsertVp9Gof(sn + 1 , kF, kF , kF);
858 InsertVp9Gof(sn , kT, kT , kF);
859 InsertVp9Gof(sn + 2 , kF, kF , kT);
860 InsertVp9Gof(sn + 4 , kF, kF , kT);
861 InsertVp9Gof(sn + 6 , kF, kF , kF);
862 InsertVp9Gof(sn + 3 , kF, kT , kF);
863 InsertVp9Gof(sn + 7 , kF, kF , kF);
864 InsertVp9Gof(sn + 5 , kF, kT , kF);
865 InsertVp9Gof(sn + 9 , kF, kT , kT);
866 InsertVp9Gof(sn + 10, kF, kT , kF);
867 InsertVp9Gof(sn + 8 , kF, kF , kT);
868 InsertVp9Gof(sn + 13, kF, kT , kF);
869 InsertVp9Gof(sn + 14, kF, kF , kF);
870 InsertVp9Gof(sn + 12, kT, kT , kT);
871 InsertVp9Gof(sn + 11, kF, kF , kT);
872 InsertVp9Gof(sn + 16, kF, kF , kF);
873 InsertVp9Gof(sn + 19, kF, kT , kF);
874 InsertVp9Gof(sn + 15, kF, kF , kF);
875 InsertVp9Gof(sn + 17, kF, kF , kT);
876 InsertVp9Gof(sn + 20, kF, kF , kT);
877 InsertVp9Gof(sn + 21, kF, kT , kT);
878 InsertVp9Gof(sn + 18, kF, kT , kT);
879
880 ASSERT_EQ(10UL, frames_from_callback_.size());
881 CheckReferencesVp9(sn + 2 , 0);
882 CheckReferencesVp9(sn + 4 , 0, sn + 2);
883 CheckReferencesVp9(sn + 8 , 0, sn + 4);
884 CheckReferencesVp9(sn + 9 , 0, sn + 8);
885 CheckReferencesVp9(sn + 11, 0, sn + 9);
886 CheckReferencesVp9(sn + 12, 0);
887 CheckReferencesVp9(sn + 17, 0, sn + 12);
888 CheckReferencesVp9(sn + 18, 0, sn + 17);
889 CheckReferencesVp9(sn + 20, 0, sn + 18);
890 CheckReferencesVp9(sn + 21, 0, sn + 20);
891}
892
893TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_0) {
894 uint16_t pid = Rand();
895 uint16_t sn = Rand();
896 GofInfoVP9 ss;
897 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer.
898
899 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
900 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
901 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 0 , 1);
902 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 2);
903 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 0 , 3);
904 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 4);
905 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 0 , 5);
906 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 6);
907 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 0 , 7);
908 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 8);
909 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 0 , 9);
910 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 10);
911 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 0 , 11);
912 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 12);
913 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 0 , 13);
914 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 14);
915 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 0 , 15);
916 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 16);
917 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 0 , 17);
918 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 18);
919 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 0 , 19);
920
921 ASSERT_EQ(20UL, frames_from_callback_.size());
922 CheckReferencesVp9(pid, 0);
923 CheckReferencesVp9(pid + 1 , 0, pid);
924 CheckReferencesVp9(pid + 2 , 0, pid + 1);
925 CheckReferencesVp9(pid + 3 , 0, pid + 2);
926 CheckReferencesVp9(pid + 4 , 0, pid + 3);
927 CheckReferencesVp9(pid + 5 , 0, pid + 4);
928 CheckReferencesVp9(pid + 6 , 0, pid + 5);
929 CheckReferencesVp9(pid + 7 , 0, pid + 6);
930 CheckReferencesVp9(pid + 8 , 0, pid + 7);
931 CheckReferencesVp9(pid + 9 , 0, pid + 8);
932 CheckReferencesVp9(pid + 10, 0, pid + 9);
933 CheckReferencesVp9(pid + 11, 0, pid + 10);
934 CheckReferencesVp9(pid + 12, 0, pid + 11);
935 CheckReferencesVp9(pid + 13, 0, pid + 12);
936 CheckReferencesVp9(pid + 14, 0, pid + 13);
937 CheckReferencesVp9(pid + 15, 0, pid + 14);
938 CheckReferencesVp9(pid + 16, 0, pid + 15);
939 CheckReferencesVp9(pid + 17, 0, pid + 16);
940 CheckReferencesVp9(pid + 18, 0, pid + 17);
941 CheckReferencesVp9(pid + 19, 0, pid + 18);
942}
943
944TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_0) {
945 uint16_t pid = Rand();
946 uint16_t sn = Rand();
947 GofInfoVP9 ss;
948 ss.SetGofInfoVP9(kTemporalStructureMode1); // Only 1 spatial layer.
949
950 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
951 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 2);
952 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 0 , 1);
953 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
954 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 4);
955 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 0 , 3);
956 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 0 , 5);
957 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 0 , 7);
958 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 6);
959 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 8);
960 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 10);
961 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 0 , 13);
962 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 0 , 11);
963 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 0 , 9);
964 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 16);
965 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 14);
966 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 0 , 15);
967 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 12);
968 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 0 , 17);
969 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 0 , 19);
970 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 18);
971
972 ASSERT_EQ(20UL, frames_from_callback_.size());
973 CheckReferencesVp9(pid, 0);
974 CheckReferencesVp9(pid + 1 , 0, pid);
975 CheckReferencesVp9(pid + 2 , 0, pid + 1);
976 CheckReferencesVp9(pid + 3 , 0, pid + 2);
977 CheckReferencesVp9(pid + 4 , 0, pid + 3);
978 CheckReferencesVp9(pid + 5 , 0, pid + 4);
979 CheckReferencesVp9(pid + 6 , 0, pid + 5);
980 CheckReferencesVp9(pid + 7 , 0, pid + 6);
981 CheckReferencesVp9(pid + 8 , 0, pid + 7);
982 CheckReferencesVp9(pid + 9 , 0, pid + 8);
983 CheckReferencesVp9(pid + 10, 0, pid + 9);
984 CheckReferencesVp9(pid + 11, 0, pid + 10);
985 CheckReferencesVp9(pid + 12, 0, pid + 11);
986 CheckReferencesVp9(pid + 13, 0, pid + 12);
987 CheckReferencesVp9(pid + 14, 0, pid + 13);
988 CheckReferencesVp9(pid + 15, 0, pid + 14);
989 CheckReferencesVp9(pid + 16, 0, pid + 15);
990 CheckReferencesVp9(pid + 17, 0, pid + 16);
991 CheckReferencesVp9(pid + 18, 0, pid + 17);
992 CheckReferencesVp9(pid + 19, 0, pid + 18);
993}
994
995TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_01) {
996 uint16_t pid = Rand();
997 uint16_t sn = Rand();
998 GofInfoVP9 ss;
999 ss.SetGofInfoVP9(kTemporalStructureMode2); // 0101 pattern
1000
1001 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1002 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1003 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0);
1004 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1);
1005 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1);
1006 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2);
1007 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 1 , 2);
1008 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 3);
1009 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 1 , 3);
1010 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 4);
1011 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 1 , 4);
1012 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 5);
1013 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 1 , 5);
1014 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 6);
1015 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 1 , 6);
1016 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 7);
1017 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 1 , 7);
1018 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 8);
1019 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 1 , 8);
1020 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 9);
1021 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 1 , 9);
1022
1023 ASSERT_EQ(20UL, frames_from_callback_.size());
1024 CheckReferencesVp9(pid, 0);
1025 CheckReferencesVp9(pid + 1 , 0, pid);
1026 CheckReferencesVp9(pid + 2 , 0, pid);
1027 CheckReferencesVp9(pid + 3 , 0, pid + 2);
1028 CheckReferencesVp9(pid + 4 , 0, pid + 2);
1029 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1030 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1031 CheckReferencesVp9(pid + 7 , 0, pid + 6);
1032 CheckReferencesVp9(pid + 8 , 0, pid + 6);
1033 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1034 CheckReferencesVp9(pid + 10, 0, pid + 8);
1035 CheckReferencesVp9(pid + 11, 0, pid + 10);
1036 CheckReferencesVp9(pid + 12, 0, pid + 10);
1037 CheckReferencesVp9(pid + 13, 0, pid + 12);
1038 CheckReferencesVp9(pid + 14, 0, pid + 12);
1039 CheckReferencesVp9(pid + 15, 0, pid + 14);
1040 CheckReferencesVp9(pid + 16, 0, pid + 14);
1041 CheckReferencesVp9(pid + 17, 0, pid + 16);
1042 CheckReferencesVp9(pid + 18, 0, pid + 16);
1043 CheckReferencesVp9(pid + 19, 0, pid + 18);
1044}
1045
1046TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_01) {
1047 uint16_t pid = Rand();
1048 uint16_t sn = Rand();
1049 GofInfoVP9 ss;
1050 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern
1051
1052 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1053 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0);
1054 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1055 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1);
1056 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2);
1057 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1);
1058 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 1 , 2);
1059 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 1 , 3);
1060 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 0 , 3);
1061 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 0 , 5);
1062 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 4);
1063 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 1 , 4);
1064 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 1 , 5);
1065 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 1 , 6);
1066 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 8);
1067 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 6);
1068 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 0 , 7);
1069 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 1 , 8);
1070 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 1 , 9);
1071 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 1 , 7);
1072 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 0 , 9);
1073
1074 ASSERT_EQ(20UL, frames_from_callback_.size());
1075 CheckReferencesVp9(pid, 0);
1076 CheckReferencesVp9(pid + 1 , 0, pid);
1077 CheckReferencesVp9(pid + 2 , 0, pid);
1078 CheckReferencesVp9(pid + 3 , 0, pid + 2);
1079 CheckReferencesVp9(pid + 4 , 0, pid + 2);
1080 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1081 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1082 CheckReferencesVp9(pid + 7 , 0, pid + 6);
1083 CheckReferencesVp9(pid + 8 , 0, pid + 6);
1084 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1085 CheckReferencesVp9(pid + 10, 0, pid + 8);
1086 CheckReferencesVp9(pid + 11, 0, pid + 10);
1087 CheckReferencesVp9(pid + 12, 0, pid + 10);
1088 CheckReferencesVp9(pid + 13, 0, pid + 12);
1089 CheckReferencesVp9(pid + 14, 0, pid + 12);
1090 CheckReferencesVp9(pid + 15, 0, pid + 14);
1091 CheckReferencesVp9(pid + 16, 0, pid + 14);
1092 CheckReferencesVp9(pid + 17, 0, pid + 16);
1093 CheckReferencesVp9(pid + 18, 0, pid + 16);
1094 CheckReferencesVp9(pid + 19, 0, pid + 18);
1095}
1096
1097TEST_F(TestPacketBuffer, Vp9GofTemporalLayers_0212) {
1098 uint16_t pid = Rand();
1099 uint16_t sn = Rand();
1100 GofInfoVP9 ss;
1101 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern
1102
1103 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1104 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1105 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0);
1106 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0);
1107 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0);
1108 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1);
1109 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1);
1110 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 1);
1111 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1);
1112 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 2);
1113 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2);
1114 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2);
1115 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 2);
1116 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3);
1117 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3);
1118 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3);
1119 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3);
1120 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 4);
1121 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 2 , 4);
1122 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 1 , 4);
1123 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 2 , 4);
1124
1125 ASSERT_EQ(20UL, frames_from_callback_.size());
1126 CheckReferencesVp9(pid, 0);
1127 CheckReferencesVp9(pid + 1 , 0, pid);
1128 CheckReferencesVp9(pid + 2 , 0, pid);
1129 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2);
1130 CheckReferencesVp9(pid + 4 , 0, pid);
1131 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1132 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1133 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6);
1134 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1135 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1136 CheckReferencesVp9(pid + 10, 0, pid + 8);
1137 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1138 CheckReferencesVp9(pid + 12, 0, pid + 8);
1139 CheckReferencesVp9(pid + 13, 0, pid + 12);
1140 CheckReferencesVp9(pid + 14, 0, pid + 12);
1141 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1142 CheckReferencesVp9(pid + 16, 0, pid + 12);
1143 CheckReferencesVp9(pid + 17, 0, pid + 16);
1144 CheckReferencesVp9(pid + 18, 0, pid + 16);
1145 CheckReferencesVp9(pid + 19, 0, pid + 17, pid + 18);
1146}
1147
1148TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_0212) {
1149 uint16_t pid = Rand();
1150 uint16_t sn = Rand();
1151 GofInfoVP9 ss;
1152 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern
1153
1154 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1155 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0);
1156 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0);
1157 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1158 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0);
1159 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 1);
1160 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1);
1161 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1);
1162 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2);
1163 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1);
1164 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 2);
1165 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 2);
1166 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2);
1167 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3);
1168 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3);
1169 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3);
1170 InsertVp9Gof(sn + 16, kF, kT , kT , kF, pid + 16, 0 , 0 , 4);
1171 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3);
1172 InsertVp9Gof(sn + 17, kF, kT , kT , kF, pid + 17, 0 , 2 , 4);
1173 InsertVp9Gof(sn + 19, kF, kT , kT , kF, pid + 19, 0 , 2 , 4);
1174 InsertVp9Gof(sn + 18, kF, kT , kT , kF, pid + 18, 0 , 1 , 4);
1175
1176 ASSERT_EQ(20UL, frames_from_callback_.size());
1177 CheckReferencesVp9(pid, 0);
1178 CheckReferencesVp9(pid + 1 , 0, pid);
1179 CheckReferencesVp9(pid + 2 , 0, pid);
1180 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2);
1181 CheckReferencesVp9(pid + 4 , 0, pid);
1182 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1183 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1184 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6);
1185 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1186 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1187 CheckReferencesVp9(pid + 10, 0, pid + 8);
1188 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1189 CheckReferencesVp9(pid + 12, 0, pid + 8);
1190 CheckReferencesVp9(pid + 13, 0, pid + 12);
1191 CheckReferencesVp9(pid + 14, 0, pid + 12);
1192 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1193 CheckReferencesVp9(pid + 16, 0, pid + 12);
1194 CheckReferencesVp9(pid + 17, 0, pid + 16);
1195 CheckReferencesVp9(pid + 18, 0, pid + 16);
1196 CheckReferencesVp9(pid + 19, 0, pid + 17, pid + 18);
1197}
1198
1199TEST_F(TestPacketBuffer, Vp9GofTemporalLayersUpSwitch_02120212) {
1200 uint16_t pid = Rand();
1201 uint16_t sn = Rand();
1202 GofInfoVP9 ss;
1203 ss.SetGofInfoVP9(kTemporalStructureMode4); // 02120212 pattern
1204
1205 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1206 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1207 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0);
1208 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0);
1209 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0);
1210 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1);
1211 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1);
1212 InsertVp9Gof(sn + 6 , kF, kT , kT , kT, pid + 6 , 0 , 1 , 1);
1213 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1);
1214 InsertVp9Gof(sn + 8 , kF, kT , kT , kT, pid + 8 , 0 , 0 , 2);
1215 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2);
1216 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2);
1217 InsertVp9Gof(sn + 11, kF, kT , kT , kT, pid + 11, 0 , 2 , 2);
1218 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3);
1219 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3);
1220 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3);
1221 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3);
1222
1223 ASSERT_EQ(16UL, frames_from_callback_.size());
1224 CheckReferencesVp9(pid, 0);
1225 CheckReferencesVp9(pid + 1 , 0, pid);
1226 CheckReferencesVp9(pid + 2 , 0, pid);
1227 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2);
1228 CheckReferencesVp9(pid + 4 , 0, pid);
1229 CheckReferencesVp9(pid + 5 , 0, pid + 3, pid + 4);
1230 CheckReferencesVp9(pid + 6 , 0, pid + 2, pid + 4);
1231 CheckReferencesVp9(pid + 7 , 0, pid + 6);
1232 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1233 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1234 CheckReferencesVp9(pid + 10, 0, pid + 8);
1235 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1236 CheckReferencesVp9(pid + 12, 0, pid + 8);
1237 CheckReferencesVp9(pid + 13, 0, pid + 11, pid + 12);
1238 CheckReferencesVp9(pid + 14, 0, pid + 10, pid + 12);
1239 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1240}
1241
1242TEST_F(TestPacketBuffer, Vp9GofTemporalLayersUpSwitchReordered_02120212) {
1243 uint16_t pid = Rand();
1244 uint16_t sn = Rand();
1245 GofInfoVP9 ss;
1246 ss.SetGofInfoVP9(kTemporalStructureMode4); // 02120212 pattern
1247
1248 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1249 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 2 , 0);
1250 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1251 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 1);
1252 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 1 , 0);
1253 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 1);
1254 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 2 , 0);
1255 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 1);
1256 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 2);
1257 InsertVp9Gof(sn + 6 , kF, kT , kT , kT, pid + 6 , 0 , 1 , 1);
1258 InsertVp9Gof(sn + 12, kF, kT , kT , kF, pid + 12, 0 , 0 , 3);
1259 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 2);
1260 InsertVp9Gof(sn + 8 , kF, kT , kT , kT, pid + 8 , 0 , 0 , 2);
1261 InsertVp9Gof(sn + 11, kF, kT , kT , kT, pid + 11, 0 , 2 , 2);
1262 InsertVp9Gof(sn + 13, kF, kT , kT , kF, pid + 13, 0 , 2 , 3);
1263 InsertVp9Gof(sn + 15, kF, kT , kT , kF, pid + 15, 0 , 2 , 3);
1264 InsertVp9Gof(sn + 14, kF, kT , kT , kF, pid + 14, 0 , 1 , 3);
1265
1266 ASSERT_EQ(16UL, frames_from_callback_.size());
1267 CheckReferencesVp9(pid, 0);
1268 CheckReferencesVp9(pid + 1 , 0, pid);
1269 CheckReferencesVp9(pid + 2 , 0, pid);
1270 CheckReferencesVp9(pid + 3 , 0, pid + 1, pid + 2);
1271 CheckReferencesVp9(pid + 4 , 0, pid);
1272 CheckReferencesVp9(pid + 5 , 0, pid + 3, pid + 4);
1273 CheckReferencesVp9(pid + 6 , 0, pid + 2, pid + 4);
1274 CheckReferencesVp9(pid + 7 , 0, pid + 6);
1275 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1276 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1277 CheckReferencesVp9(pid + 10, 0, pid + 8);
1278 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1279 CheckReferencesVp9(pid + 12, 0, pid + 8);
1280 CheckReferencesVp9(pid + 13, 0, pid + 11, pid + 12);
1281 CheckReferencesVp9(pid + 14, 0, pid + 10, pid + 12);
1282 CheckReferencesVp9(pid + 15, 0, pid + 13, pid + 14);
1283}
1284
1285TEST_F(TestPacketBuffer, Vp9GofTemporalLayersReordered_01_0212) {
1286 uint16_t pid = Rand();
1287 uint16_t sn = Rand();
1288 GofInfoVP9 ss;
1289 ss.SetGofInfoVP9(kTemporalStructureMode2); // 01 pattern
1290
1291 // sn , kf, frst, lst, up, pid , sid, tid, tl0, ss
1292 InsertVp9Gof(sn + 1 , kF, kT , kT , kF, pid + 1 , 0 , 1 , 0);
1293 InsertVp9Gof(sn , kT, kT , kT , kF, pid , 0 , 0 , 0 , &ss);
1294 InsertVp9Gof(sn + 3 , kF, kT , kT , kF, pid + 3 , 0 , 1 , 1);
1295 InsertVp9Gof(sn + 6 , kF, kT , kT , kF, pid + 6 , 0 , 1 , 2);
1296 ss.SetGofInfoVP9(kTemporalStructureMode3); // 0212 pattern
1297 InsertVp9Gof(sn + 4 , kF, kT , kT , kF, pid + 4 , 0 , 0 , 2 , &ss);
1298 InsertVp9Gof(sn + 2 , kF, kT , kT , kF, pid + 2 , 0 , 0 , 1);
1299 InsertVp9Gof(sn + 5 , kF, kT , kT , kF, pid + 5 , 0 , 2 , 2);
1300 InsertVp9Gof(sn + 8 , kF, kT , kT , kF, pid + 8 , 0 , 0 , 3);
1301 InsertVp9Gof(sn + 10, kF, kT , kT , kF, pid + 10, 0 , 1 , 3);
1302 InsertVp9Gof(sn + 7 , kF, kT , kT , kF, pid + 7 , 0 , 2 , 2);
1303 InsertVp9Gof(sn + 11, kF, kT , kT , kF, pid + 11, 0 , 2 , 3);
1304 InsertVp9Gof(sn + 9 , kF, kT , kT , kF, pid + 9 , 0 , 2 , 3);
1305
1306 ASSERT_EQ(12UL, frames_from_callback_.size());
1307 CheckReferencesVp9(pid, 0);
1308 CheckReferencesVp9(pid + 1 , 0, pid);
1309 CheckReferencesVp9(pid + 2 , 0, pid);
1310 CheckReferencesVp9(pid + 3 , 0, pid + 2);
1311 CheckReferencesVp9(pid + 4 , 0, pid);
1312 CheckReferencesVp9(pid + 5 , 0, pid + 4);
1313 CheckReferencesVp9(pid + 6 , 0, pid + 4);
1314 CheckReferencesVp9(pid + 7 , 0, pid + 5, pid + 6);
1315 CheckReferencesVp9(pid + 8 , 0, pid + 4);
1316 CheckReferencesVp9(pid + 9 , 0, pid + 8);
1317 CheckReferencesVp9(pid + 10, 0, pid + 8);
1318 CheckReferencesVp9(pid + 11, 0, pid + 9, pid + 10);
1319}
1320
1321TEST_F(TestPacketBuffer, Vp9FlexibleModeOneFrame) {
1322 uint16_t pid = Rand();
1323 uint16_t sn = Rand();
1324
1325 // sn, kf, frst, lst, intr, pid, sid, tid, tl0
1326 InsertVp9Flex(sn, kT, kT , kT , kF , pid, 0 , 0 , 0);
1327
1328 ASSERT_EQ(1UL, frames_from_callback_.size());
1329 CheckReferencesVp9(pid, 0);
1330}
1331
1332TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayers) {
1333 uint16_t pid = Rand();
1334 uint16_t sn = Rand();
1335
1336 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs
1337 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0);
1338 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0);
1339 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1});
1340 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2});
1341 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1});
1342 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1});
1343 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2});
1344 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1});
1345 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1});
1346 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2});
1347 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1});
1348 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1});
1349 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2});
1350 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1});
1351
1352 ASSERT_EQ(14UL, frames_from_callback_.size());
1353 CheckReferencesVp9(pid , 0);
1354 CheckReferencesVp9(pid , 1);
1355 CheckReferencesVp9(pid + 1, 1, pid);
1356 CheckReferencesVp9(pid + 2, 0, pid);
1357 CheckReferencesVp9(pid + 2, 1, pid + 1);
1358 CheckReferencesVp9(pid + 3, 1, pid + 2);
1359 CheckReferencesVp9(pid + 4, 0, pid + 2);
1360 CheckReferencesVp9(pid + 4, 1, pid + 3);
1361 CheckReferencesVp9(pid + 5, 1, pid + 4);
1362 CheckReferencesVp9(pid + 6, 0, pid + 4);
1363 CheckReferencesVp9(pid + 6, 1, pid + 5);
1364 CheckReferencesVp9(pid + 7, 1, pid + 6);
1365 CheckReferencesVp9(pid + 8, 0, pid + 6);
1366 CheckReferencesVp9(pid + 8, 1, pid + 7);
1367}
1368
1369TEST_F(TestPacketBuffer, Vp9FlexibleModeTwoSpatialLayersReordered) {
1370 uint16_t pid = Rand();
1371 uint16_t sn = Rand();
1372
1373 // sn , kf, frst, lst, intr, pid , sid, tid, tl0, refs
1374 InsertVp9Flex(sn + 1 , kT, kT , kT , kT , pid , 1 , 0 , 0);
1375 InsertVp9Flex(sn + 2 , kF, kT , kT , kF , pid + 1, 1 , 0 , 0 , {1});
1376 InsertVp9Flex(sn , kT, kT , kT , kF , pid , 0 , 0 , 0);
1377 InsertVp9Flex(sn + 4 , kF, kT , kT , kF , pid + 2, 1 , 0 , 1 , {1});
1378 InsertVp9Flex(sn + 5 , kF, kT , kT , kF , pid + 3, 1 , 0 , 1 , {1});
1379 InsertVp9Flex(sn + 3 , kF, kT , kT , kF , pid + 2, 0 , 0 , 1 , {2});
1380 InsertVp9Flex(sn + 7 , kF, kT , kT , kF , pid + 4, 1 , 0 , 2 , {1});
1381 InsertVp9Flex(sn + 6 , kF, kT , kT , kF , pid + 4, 0 , 0 , 2 , {2});
1382 InsertVp9Flex(sn + 8 , kF, kT , kT , kF , pid + 5, 1 , 0 , 2 , {1});
1383 InsertVp9Flex(sn + 9 , kF, kT , kT , kF , pid + 6, 0 , 0 , 3 , {2});
1384 InsertVp9Flex(sn + 11, kF, kT , kT , kF , pid + 7, 1 , 0 , 3 , {1});
1385 InsertVp9Flex(sn + 10, kF, kT , kT , kF , pid + 6, 1 , 0 , 3 , {1});
1386 InsertVp9Flex(sn + 13, kF, kT , kT , kF , pid + 8, 1 , 0 , 4 , {1});
1387 InsertVp9Flex(sn + 12, kF, kT , kT , kF , pid + 8, 0 , 0 , 4 , {2});
1388
1389 ASSERT_EQ(14UL, frames_from_callback_.size());
1390 CheckReferencesVp9(pid , 0);
1391 CheckReferencesVp9(pid , 1);
1392 CheckReferencesVp9(pid + 1, 1, pid);
1393 CheckReferencesVp9(pid + 2, 0, pid);
1394 CheckReferencesVp9(pid + 2, 1, pid + 1);
1395 CheckReferencesVp9(pid + 3, 1, pid + 2);
1396 CheckReferencesVp9(pid + 4, 0, pid + 2);
1397 CheckReferencesVp9(pid + 4, 1, pid + 3);
1398 CheckReferencesVp9(pid + 5, 1, pid + 4);
1399 CheckReferencesVp9(pid + 6, 0, pid + 4);
1400 CheckReferencesVp9(pid + 6, 1, pid + 5);
1401 CheckReferencesVp9(pid + 7, 1, pid + 6);
1402 CheckReferencesVp9(pid + 8, 0, pid + 6);
1403 CheckReferencesVp9(pid + 8, 1, pid + 7);
philipelc707ab72016-04-01 02:01:54 -07001404}
1405
1406} // namespace video_coding
1407} // namespace webrtc