OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 namespace webrtc { | 23 namespace webrtc { |
24 namespace video_coding { | 24 namespace video_coding { |
25 | 25 |
26 class TestPacketBuffer : public ::testing::Test, | 26 class TestPacketBuffer : public ::testing::Test, |
27 public OnCompleteFrameCallback { | 27 public OnCompleteFrameCallback { |
28 protected: | 28 protected: |
29 TestPacketBuffer() | 29 TestPacketBuffer() |
30 : rand_(0x8739211), | 30 : rand_(0x8739211), |
31 packet_buffer_(new PacketBuffer(kStartSize, kMaxSize, this)), | 31 packet_buffer_(new PacketBuffer(kStartSize, kMaxSize, this)), |
32 frames_from_callback_(FrameComp()) {} | 32 frames_from_callback_(FrameComp()), |
| 33 dummy_data_(new uint8_t[kDummyDataSize]()) {} |
33 | 34 |
34 uint16_t Rand() { return rand_.Rand(std::numeric_limits<uint16_t>::max()); } | 35 uint16_t Rand() { return rand_.Rand(std::numeric_limits<uint16_t>::max()); } |
35 | 36 |
36 void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override { | 37 void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override { |
37 uint16_t pid = frame->picture_id; | 38 uint16_t pid = frame->picture_id; |
38 uint16_t sidx = frame->spatial_layer; | 39 uint16_t sidx = frame->spatial_layer; |
39 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx)); | 40 auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx)); |
40 if (frame_it != frames_from_callback_.end()) { | 41 if (frame_it != frames_from_callback_.end()) { |
41 ADD_FAILURE() << "Already received frame with (pid:sidx): (" | 42 ADD_FAILURE() << "Already received frame with (pid:sidx): (" |
42 << pid << ":" << sidx << ")"; | 43 << pid << ":" << sidx << ")"; |
(...skipping 11 matching lines...) Expand all Loading... |
54 frames_from_callback_.clear(); | 55 frames_from_callback_.clear(); |
55 } | 56 } |
56 | 57 |
57 // Short version of true and false. | 58 // Short version of true and false. |
58 enum { | 59 enum { |
59 kT = true, | 60 kT = true, |
60 kF = false | 61 kF = false |
61 }; | 62 }; |
62 | 63 |
63 // Insert a generic packet into the packet buffer. | 64 // Insert a generic packet into the packet buffer. |
64 void InsertGeneric(uint16_t seq_num, // packet sequence number | 65 void InsertGeneric(uint16_t seq_num, // packet sequence number |
65 bool keyframe, // is keyframe | 66 bool keyframe, // is keyframe |
66 bool first, // is first packet of frame | 67 bool first, // is first packet of frame |
67 bool last, // is last packet of frame | 68 bool last, // is last packet of frame |
68 size_t data_size = 0, // size of data | 69 int data_size = -1, // size of data |
69 uint8_t* data = nullptr) { // data pointer | 70 uint8_t* data = nullptr) { // data pointer |
| 71 if (data_size == -1) { |
| 72 data_size = kDummyDataSize; |
| 73 data = dummy_data_.get(); |
| 74 } |
| 75 |
70 VCMPacket packet; | 76 VCMPacket packet; |
71 packet.codec = kVideoCodecGeneric; | 77 packet.codec = kVideoCodecGeneric; |
72 packet.seqNum = seq_num; | 78 packet.seqNum = seq_num; |
73 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 79 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
74 packet.isFirstPacket = first; | 80 packet.isFirstPacket = first; |
75 packet.markerBit = last; | 81 packet.markerBit = last; |
76 packet.sizeBytes = data_size; | 82 packet.sizeBytes = data_size; |
77 packet.dataPtr = data; | 83 packet.dataPtr = data; |
78 | 84 |
79 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 85 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
80 } | 86 } |
81 | 87 |
82 // Insert a Vp8 packet into the packet buffer. | 88 // Insert a Vp8 packet into the packet buffer. |
83 void InsertVp8(uint16_t seq_num, // packet sequence number | 89 void InsertVp8(uint16_t seq_num, // packet sequence number |
84 bool keyframe, // is keyframe | 90 bool keyframe, // is keyframe |
85 bool first, // is first packet of frame | 91 bool first, // is first packet of frame |
86 bool last, // is last packet of frame | 92 bool last, // is last packet of frame |
87 bool sync = false, // is sync frame | 93 bool sync = false, // is sync frame |
88 int32_t pid = kNoPictureId, // picture id | 94 int32_t pid = kNoPictureId, // picture id |
89 uint8_t tid = kNoTemporalIdx, // temporal id | 95 uint8_t tid = kNoTemporalIdx, // temporal id |
90 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index | 96 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index |
91 size_t data_size = 0, // size of data | 97 int data_size = -1, // size of data |
92 uint8_t* data = nullptr) { // data pointer | 98 uint8_t* data = nullptr) { // data pointer |
| 99 if (data_size == -1) { |
| 100 data_size = kDummyDataSize; |
| 101 data = dummy_data_.get(); |
| 102 } |
| 103 |
93 VCMPacket packet; | 104 VCMPacket packet; |
94 packet.codec = kVideoCodecVP8; | 105 packet.codec = kVideoCodecVP8; |
95 packet.seqNum = seq_num; | 106 packet.seqNum = seq_num; |
96 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 107 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
97 packet.isFirstPacket = first; | 108 packet.isFirstPacket = first; |
98 packet.markerBit = last; | 109 packet.markerBit = last; |
99 packet.sizeBytes = data_size; | 110 packet.sizeBytes = data_size; |
100 packet.dataPtr = data; | 111 packet.dataPtr = data; |
101 packet.video_header.codecHeader.VP8.pictureId = pid % (1 << 15); | 112 packet.video_header.codecHeader.VP8.pictureId = pid % (1 << 15); |
102 packet.video_header.codecHeader.VP8.temporalIdx = tid; | 113 packet.video_header.codecHeader.VP8.temporalIdx = tid; |
103 packet.video_header.codecHeader.VP8.tl0PicIdx = tl0; | 114 packet.video_header.codecHeader.VP8.tl0PicIdx = tl0; |
104 packet.video_header.codecHeader.VP8.layerSync = sync; | 115 packet.video_header.codecHeader.VP8.layerSync = sync; |
105 | 116 |
106 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 117 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
107 } | 118 } |
108 | 119 |
109 // Insert a Vp9 packet into the packet buffer. | 120 // Insert a Vp9 packet into the packet buffer. |
110 void InsertVp9Gof(uint16_t seq_num, // packet sequence number | 121 void InsertVp9Gof(uint16_t seq_num, // packet sequence number |
111 bool keyframe, // is keyframe | 122 bool keyframe, // is keyframe |
112 bool first, // is first packet of frame | 123 bool first, // is first packet of frame |
113 bool last, // is last packet of frame | 124 bool last, // is last packet of frame |
114 bool up = false, // frame is up-switch point | 125 bool up = false, // frame is up-switch point |
115 int32_t pid = kNoPictureId, // picture id | 126 int32_t pid = kNoPictureId, // picture id |
116 uint8_t sid = kNoSpatialIdx, // spatial id | 127 uint8_t sid = kNoSpatialIdx, // spatial id |
117 uint8_t tid = kNoTemporalIdx, // temporal id | 128 uint8_t tid = kNoTemporalIdx, // temporal id |
118 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index | 129 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index |
119 GofInfoVP9* ss = nullptr, // scalability structure | 130 GofInfoVP9* ss = nullptr, // scalability structure |
120 size_t data_size = 0, // size of data | 131 int data_size = -1, // size of data |
121 uint8_t* data = nullptr) { // data pointer | 132 uint8_t* data = nullptr) { // data pointer |
| 133 if (data_size == -1) { |
| 134 data_size = kDummyDataSize; |
| 135 data = dummy_data_.get(); |
| 136 } |
| 137 |
122 VCMPacket packet; | 138 VCMPacket packet; |
123 packet.codec = kVideoCodecVP9; | 139 packet.codec = kVideoCodecVP9; |
124 packet.seqNum = seq_num; | 140 packet.seqNum = seq_num; |
125 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 141 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
126 packet.isFirstPacket = first; | 142 packet.isFirstPacket = first; |
127 packet.markerBit = last; | 143 packet.markerBit = last; |
128 packet.sizeBytes = data_size; | 144 packet.sizeBytes = data_size; |
129 packet.dataPtr = data; | 145 packet.dataPtr = data; |
130 packet.video_header.codecHeader.VP9.flexible_mode = false; | 146 packet.video_header.codecHeader.VP9.flexible_mode = false; |
131 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); | 147 packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15); |
132 packet.video_header.codecHeader.VP9.temporal_idx = tid; | 148 packet.video_header.codecHeader.VP9.temporal_idx = tid; |
133 packet.video_header.codecHeader.VP9.spatial_idx = sid; | 149 packet.video_header.codecHeader.VP9.spatial_idx = sid; |
134 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; | 150 packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0; |
135 packet.video_header.codecHeader.VP9.temporal_up_switch = up; | 151 packet.video_header.codecHeader.VP9.temporal_up_switch = up; |
136 if (ss != nullptr) { | 152 if (ss != nullptr) { |
137 packet.video_header.codecHeader.VP9.ss_data_available = true; | 153 packet.video_header.codecHeader.VP9.ss_data_available = true; |
138 packet.video_header.codecHeader.VP9.gof = *ss; | 154 packet.video_header.codecHeader.VP9.gof = *ss; |
139 } | 155 } |
140 | 156 |
141 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 157 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
142 } | 158 } |
143 | 159 |
144 // Insert a Vp9 packet into the packet buffer. | 160 // Insert a Vp9 packet into the packet buffer. |
145 void InsertVp9Flex(uint16_t seq_num, // packet sequence number | 161 void InsertVp9Flex( |
146 bool keyframe, // is keyframe | 162 uint16_t seq_num, // packet sequence number |
147 bool first, // is first packet of frame | 163 bool keyframe, // is keyframe |
148 bool last, // is last packet of frame | 164 bool first, // is first packet of frame |
149 bool inter, // depends on S-1 layer | 165 bool last, // is last packet of frame |
150 int32_t pid = kNoPictureId, // picture id | 166 bool inter, // depends on S-1 layer |
151 uint8_t sid = kNoSpatialIdx, // spatial id | 167 int32_t pid = kNoPictureId, // picture id |
152 uint8_t tid = kNoTemporalIdx, // temporal id | 168 uint8_t sid = kNoSpatialIdx, // spatial id |
153 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index | 169 uint8_t tid = kNoTemporalIdx, // temporal id |
154 std::vector<uint8_t> refs = | 170 int32_t tl0 = kNoTl0PicIdx, // tl0 pic index |
155 std::vector<uint8_t>(), // frame references | 171 std::vector<uint8_t> refs = std::vector<uint8_t>(), // frame references |
156 size_t data_size = 0, // size of data | 172 int data_size = -1, // size of data |
157 uint8_t* data = nullptr) { // data pointer | 173 uint8_t* data = nullptr) { // data pointer |
| 174 if (data_size == -1) { |
| 175 data_size = kDummyDataSize; |
| 176 data = dummy_data_.get(); |
| 177 } |
| 178 |
158 VCMPacket packet; | 179 VCMPacket packet; |
159 packet.codec = kVideoCodecVP9; | 180 packet.codec = kVideoCodecVP9; |
160 packet.seqNum = seq_num; | 181 packet.seqNum = seq_num; |
161 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; | 182 packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta; |
162 packet.isFirstPacket = first; | 183 packet.isFirstPacket = first; |
163 packet.markerBit = last; | 184 packet.markerBit = last; |
164 packet.sizeBytes = data_size; | 185 packet.sizeBytes = data_size; |
165 packet.dataPtr = data; | 186 packet.dataPtr = data; |
166 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; | 187 packet.video_header.codecHeader.VP9.inter_layer_predicted = inter; |
167 packet.video_header.codecHeader.VP9.flexible_mode = true; | 188 packet.video_header.codecHeader.VP9.flexible_mode = true; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 template <typename... T> | 238 template <typename... T> |
218 void RefsToSet(std::set<uint16_t>* m, uint16_t ref, T... refs) const { | 239 void RefsToSet(std::set<uint16_t>* m, uint16_t ref, T... refs) const { |
219 m->insert(ref); | 240 m->insert(ref); |
220 RefsToSet(m, refs...); | 241 RefsToSet(m, refs...); |
221 } | 242 } |
222 | 243 |
223 void RefsToSet(std::set<uint16_t>* m) const {} | 244 void RefsToSet(std::set<uint16_t>* m) const {} |
224 | 245 |
225 const int kStartSize = 16; | 246 const int kStartSize = 16; |
226 const int kMaxSize = 64; | 247 const int kMaxSize = 64; |
| 248 const int kDummyDataSize = 4; |
227 | 249 |
228 Random rand_; | 250 Random rand_; |
229 std::unique_ptr<PacketBuffer> packet_buffer_; | 251 std::unique_ptr<PacketBuffer> packet_buffer_; |
230 struct FrameComp { | 252 struct FrameComp { |
231 bool operator()(const std::pair<uint16_t, uint8_t> f1, | 253 bool operator()(const std::pair<uint16_t, uint8_t> f1, |
232 const std::pair<uint16_t, uint8_t> f2) const { | 254 const std::pair<uint16_t, uint8_t> f2) const { |
233 if (f1.first == f2.first) | 255 if (f1.first == f2.first) |
234 return f1.second < f2.second; | 256 return f1.second < f2.second; |
235 return f1.first < f2.first; | 257 return f1.first < f2.first; |
236 } | 258 } |
237 }; | 259 }; |
238 std::map<std::pair<uint16_t, uint8_t>, | 260 std::map<std::pair<uint16_t, uint8_t>, |
239 std::unique_ptr<FrameObject>, | 261 std::unique_ptr<FrameObject>, |
240 FrameComp> frames_from_callback_; | 262 FrameComp> frames_from_callback_; |
| 263 |
| 264 std::unique_ptr<uint8_t[]> dummy_data_; |
241 }; | 265 }; |
242 | 266 |
243 TEST_F(TestPacketBuffer, InsertOnePacket) { | 267 TEST_F(TestPacketBuffer, InsertOnePacket) { |
244 VCMPacket packet; | 268 VCMPacket packet; |
245 packet.seqNum = Rand(); | 269 packet.seqNum = Rand(); |
246 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 270 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
247 } | 271 } |
248 | 272 |
249 TEST_F(TestPacketBuffer, InsertMultiplePackets) { | 273 TEST_F(TestPacketBuffer, InsertMultiplePackets) { |
250 VCMPacket packet; | 274 VCMPacket packet; |
(...skipping 16 matching lines...) Expand all Loading... |
267 | 291 |
268 TEST_F(TestPacketBuffer, NackCount) { | 292 TEST_F(TestPacketBuffer, NackCount) { |
269 uint16_t seq_num = Rand(); | 293 uint16_t seq_num = Rand(); |
270 | 294 |
271 VCMPacket packet; | 295 VCMPacket packet; |
272 packet.codec = kVideoCodecGeneric; | 296 packet.codec = kVideoCodecGeneric; |
273 packet.seqNum = seq_num; | 297 packet.seqNum = seq_num; |
274 packet.frameType = kVideoFrameKey; | 298 packet.frameType = kVideoFrameKey; |
275 packet.isFirstPacket = true; | 299 packet.isFirstPacket = true; |
276 packet.markerBit = false; | 300 packet.markerBit = false; |
277 packet.sizeBytes = 0; | 301 packet.dataPtr = dummy_data_.get(); |
278 packet.dataPtr = nullptr; | 302 packet.sizeBytes = kDummyDataSize; |
279 packet.timesNacked = 0; | 303 packet.timesNacked = 0; |
280 | 304 |
281 packet_buffer_->InsertPacket(packet); | 305 packet_buffer_->InsertPacket(packet); |
282 | 306 |
283 packet.seqNum++; | 307 packet.seqNum++; |
284 packet.isFirstPacket = false; | 308 packet.isFirstPacket = false; |
285 packet.timesNacked = 1; | 309 packet.timesNacked = 1; |
286 packet_buffer_->InsertPacket(packet); | 310 packet_buffer_->InsertPacket(packet); |
287 | 311 |
288 packet.seqNum++; | 312 packet.seqNum++; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 InsertGeneric(seq_num , kT, kT , kF); | 395 InsertGeneric(seq_num , kT, kT , kF); |
372 InsertGeneric(seq_num + 2, kT, kF , kT); | 396 InsertGeneric(seq_num + 2, kT, kF , kT); |
373 InsertGeneric(seq_num + 1, kT, kF , kF); | 397 InsertGeneric(seq_num + 1, kT, kF , kF); |
374 | 398 |
375 EXPECT_EQ(1UL, frames_from_callback_.size()); | 399 EXPECT_EQ(1UL, frames_from_callback_.size()); |
376 } | 400 } |
377 | 401 |
378 TEST_F(TestPacketBuffer, DiscardOldPacket) { | 402 TEST_F(TestPacketBuffer, DiscardOldPacket) { |
379 uint16_t seq_num = Rand(); | 403 uint16_t seq_num = Rand(); |
380 VCMPacket packet; | 404 VCMPacket packet; |
| 405 packet.dataPtr = dummy_data_.get(); |
| 406 packet.sizeBytes = kDummyDataSize; |
381 packet.seqNum = Rand(); | 407 packet.seqNum = Rand(); |
382 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 408 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
383 packet.seqNum += 2; | 409 packet.seqNum += 2; |
384 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 410 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
385 | 411 |
386 for (int i = 3; i < kMaxSize; ++i) { | 412 for (int i = 3; i < kMaxSize; ++i) { |
387 ++packet.seqNum; | 413 ++packet.seqNum; |
388 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 414 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
389 } | 415 } |
390 | 416 |
391 ++packet.seqNum; | 417 ++packet.seqNum; |
392 EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); | 418 EXPECT_FALSE(packet_buffer_->InsertPacket(packet)); |
393 packet_buffer_->ClearTo(seq_num + 1); | 419 packet_buffer_->ClearTo(seq_num + 1); |
394 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 420 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
395 } | 421 } |
396 | 422 |
397 TEST_F(TestPacketBuffer, DiscardMultipleOldPackets) { | 423 TEST_F(TestPacketBuffer, DiscardMultipleOldPackets) { |
398 uint16_t seq_num = Rand(); | 424 uint16_t seq_num = Rand(); |
399 VCMPacket packet; | 425 VCMPacket packet; |
| 426 packet.dataPtr = dummy_data_.get(); |
| 427 packet.sizeBytes = kDummyDataSize; |
400 packet.seqNum = seq_num; | 428 packet.seqNum = seq_num; |
401 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 429 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
402 packet.seqNum += 2; | 430 packet.seqNum += 2; |
403 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 431 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
404 | 432 |
405 for (int i = 3; i < kMaxSize; ++i) { | 433 for (int i = 3; i < kMaxSize; ++i) { |
406 ++packet.seqNum; | 434 ++packet.seqNum; |
407 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 435 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
408 } | 436 } |
409 | 437 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 // seq_num , kf, frst, lst, data_size , data | 493 // seq_num , kf, frst, lst, data_size , data |
466 InsertGeneric(seq_num , kT, kT , kF , sizeof(many) , many); | 494 InsertGeneric(seq_num , kT, kT , kF , sizeof(many) , many); |
467 InsertGeneric(seq_num + 1, kF, kF , kF , sizeof(bitstream), bitstream); | 495 InsertGeneric(seq_num + 1, kF, kF , kF , sizeof(bitstream), bitstream); |
468 InsertGeneric(seq_num + 2, kF, kF , kF , sizeof(such) , such); | 496 InsertGeneric(seq_num + 2, kF, kF , kF , sizeof(such) , such); |
469 InsertGeneric(seq_num + 3, kF, kF , kT , sizeof(data) , data); | 497 InsertGeneric(seq_num + 3, kF, kF , kT , sizeof(data) , data); |
470 | 498 |
471 ASSERT_EQ(1UL, frames_from_callback_.size()); | 499 ASSERT_EQ(1UL, frames_from_callback_.size()); |
472 CheckReferencesVp8(seq_num + 3); | 500 CheckReferencesVp8(seq_num + 3); |
473 EXPECT_TRUE(frames_from_callback_[std::make_pair(seq_num + 3, 0)]-> | 501 EXPECT_TRUE(frames_from_callback_[std::make_pair(seq_num + 3, 0)]-> |
474 GetBitstream(result)); | 502 GetBitstream(result)); |
475 EXPECT_EQ(std::strcmp("many bitstream, such data", | 503 EXPECT_EQ(memcmp(result, "many bitstream, such data", sizeof(result)), 0); |
476 reinterpret_cast<char*>(result)), | |
477 0); | |
478 } | 504 } |
479 | 505 |
480 TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) { | 506 TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) { |
481 uint16_t seq_num = Rand(); | 507 uint16_t seq_num = Rand(); |
482 | 508 |
483 // seq_num , kf, frst, lst | 509 // seq_num , kf, frst, lst |
484 InsertGeneric(seq_num , kT, kT , kF); | 510 InsertGeneric(seq_num , kT, kT , kF); |
485 InsertGeneric(seq_num + 1, kF, kF , kF); | 511 InsertGeneric(seq_num + 1, kF, kF , kF); |
486 InsertGeneric(seq_num + 2, kF, kF , kT); | 512 InsertGeneric(seq_num + 2, kF, kF , kT); |
487 EXPECT_EQ(1UL, frames_from_callback_.size()); | 513 EXPECT_EQ(1UL, frames_from_callback_.size()); |
(...skipping 20 matching lines...) Expand all Loading... |
508 | 534 |
509 // seq_num , kf, frst, lst | 535 // seq_num , kf, frst, lst |
510 InsertGeneric(seq_num + kStartSize , kT, kT , kF); | 536 InsertGeneric(seq_num + kStartSize , kT, kT , kF); |
511 InsertGeneric(seq_num + kStartSize + 1, kF, kF , kF); | 537 InsertGeneric(seq_num + kStartSize + 1, kF, kF , kF); |
512 InsertGeneric(seq_num + kStartSize + 2, kF, kF , kT); | 538 InsertGeneric(seq_num + kStartSize + 2, kF, kF , kT); |
513 EXPECT_EQ(2UL, frames_from_callback_.size()); | 539 EXPECT_EQ(2UL, frames_from_callback_.size()); |
514 } | 540 } |
515 | 541 |
516 TEST_F(TestPacketBuffer, InvalidateFrameByClearing) { | 542 TEST_F(TestPacketBuffer, InvalidateFrameByClearing) { |
517 VCMPacket packet; | 543 VCMPacket packet; |
| 544 packet.dataPtr = dummy_data_.get(); |
| 545 packet.sizeBytes = kDummyDataSize; |
518 packet.codec = kVideoCodecGeneric; | 546 packet.codec = kVideoCodecGeneric; |
519 packet.frameType = kVideoFrameKey; | 547 packet.frameType = kVideoFrameKey; |
520 packet.isFirstPacket = kT; | 548 packet.isFirstPacket = kT; |
521 packet.markerBit = kT; | 549 packet.markerBit = kT; |
522 packet.seqNum = Rand(); | 550 packet.seqNum = Rand(); |
523 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); | 551 EXPECT_TRUE(packet_buffer_->InsertPacket(packet)); |
524 ASSERT_EQ(1UL, frames_from_callback_.size()); | 552 ASSERT_EQ(1UL, frames_from_callback_.size()); |
525 | 553 |
526 packet_buffer_->Clear(); | 554 packet_buffer_->Clear(); |
527 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr)); | 555 EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr)); |
528 } | 556 } |
529 | 557 |
| 558 TEST_F(TestPacketBuffer, PaddingPackets) { |
| 559 uint16_t seq_num = Rand(); |
| 560 |
| 561 // seq_num , kf, frst, lst |
| 562 InsertGeneric(seq_num , kT, kT , kT); |
| 563 InsertGeneric(seq_num + 1, kF, kF , kF, 0, nullptr); |
| 564 InsertGeneric(seq_num + 3, kF, kT , kT); |
| 565 EXPECT_EQ(1UL, frames_from_callback_.size()); |
| 566 InsertGeneric(seq_num + 2, kF, kF , kF, 0, nullptr); |
| 567 EXPECT_EQ(2UL, frames_from_callback_.size()); |
| 568 } |
| 569 |
| 570 TEST_F(TestPacketBuffer, PaddingPacketsReordered) { |
| 571 uint16_t seq_num = Rand(); |
| 572 |
| 573 // seq_num , kf, frst, lst |
| 574 InsertGeneric(seq_num , kT, kT , kT); |
| 575 InsertGeneric(seq_num + 1, kF, kF , kF, 0, nullptr); |
| 576 InsertGeneric(seq_num + 2, kF, kT , kF); |
| 577 InsertGeneric(seq_num + 4, kF, kF , kF, 0, nullptr); |
| 578 InsertGeneric(seq_num + 3, kF, kF , kT); |
| 579 EXPECT_EQ(2UL, frames_from_callback_.size()); |
| 580 CheckReferencesGeneric(seq_num); |
| 581 CheckReferencesGeneric(seq_num + 3, seq_num); |
| 582 } |
| 583 |
| 584 TEST_F(TestPacketBuffer, PaddingPacketsReorderedMultipleKeyframes) { |
| 585 uint16_t seq_num = Rand(); |
| 586 |
| 587 // seq_num , kf, frst, lst |
| 588 InsertGeneric(seq_num , kT, kT , kT); |
| 589 InsertGeneric(seq_num + 2, kF, kT , kF); |
| 590 InsertGeneric(seq_num + 1, kF, kF , kF, 0, nullptr); |
| 591 InsertGeneric(seq_num + 4, kF, kF , kF, 0, nullptr); |
| 592 InsertGeneric(seq_num + 5, kT, kT , kT); |
| 593 InsertGeneric(seq_num + 3, kF, kF , kT); |
| 594 InsertGeneric(seq_num + 6, kF, kF , kF, 0, nullptr); |
| 595 InsertGeneric(seq_num + 9, kF, kF , kF, 0, nullptr); |
| 596 InsertGeneric(seq_num + 8, kF, kF , kT); |
| 597 InsertGeneric(seq_num + 7, kF, kT , kF); |
| 598 EXPECT_EQ(4UL, frames_from_callback_.size()); |
| 599 } |
| 600 |
530 TEST_F(TestPacketBuffer, Vp8NoPictureId) { | 601 TEST_F(TestPacketBuffer, Vp8NoPictureId) { |
531 uint16_t seq_num = Rand(); | 602 uint16_t seq_num = Rand(); |
532 | 603 |
533 // seq_num , kf, frst, lst | 604 // seq_num , kf, frst, lst |
534 InsertVp8(seq_num , kT, kT , kF); | 605 InsertVp8(seq_num , kT, kT , kF); |
535 InsertVp8(seq_num + 1 , kF, kF , kF); | 606 InsertVp8(seq_num + 1 , kF, kF , kF); |
536 InsertVp8(seq_num + 2 , kF, kF , kT); | 607 InsertVp8(seq_num + 2 , kF, kF , kT); |
537 ASSERT_EQ(1UL, frames_from_callback_.size()); | 608 ASSERT_EQ(1UL, frames_from_callback_.size()); |
538 | 609 |
539 InsertVp8(seq_num + 3 , kF, kT , kF); | 610 InsertVp8(seq_num + 3 , kF, kT , kF); |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1448 CheckReferencesVp9(pid + 5, 1, pid + 4); | 1519 CheckReferencesVp9(pid + 5, 1, pid + 4); |
1449 CheckReferencesVp9(pid + 6, 0, pid + 4); | 1520 CheckReferencesVp9(pid + 6, 0, pid + 4); |
1450 CheckReferencesVp9(pid + 6, 1, pid + 5); | 1521 CheckReferencesVp9(pid + 6, 1, pid + 5); |
1451 CheckReferencesVp9(pid + 7, 1, pid + 6); | 1522 CheckReferencesVp9(pid + 7, 1, pid + 6); |
1452 CheckReferencesVp9(pid + 8, 0, pid + 6); | 1523 CheckReferencesVp9(pid + 8, 0, pid + 6); |
1453 CheckReferencesVp9(pid + 8, 1, pid + 7); | 1524 CheckReferencesVp9(pid + 8, 1, pid + 7); |
1454 } | 1525 } |
1455 | 1526 |
1456 } // namespace video_coding | 1527 } // namespace video_coding |
1457 } // namespace webrtc | 1528 } // namespace webrtc |
OLD | NEW |