OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
131 virtual void SetUp() { | 131 virtual void SetUp() { |
132 expected_.InitRTPVideoHeaderVP9(); | 132 expected_.InitRTPVideoHeaderVP9(); |
133 } | 133 } |
134 | 134 |
135 RtpPacketToSend packet_; | 135 RtpPacketToSend packet_; |
136 std::unique_ptr<uint8_t[]> payload_; | 136 std::unique_ptr<uint8_t[]> payload_; |
137 size_t payload_size_; | 137 size_t payload_size_; |
138 size_t payload_pos_; | 138 size_t payload_pos_; |
139 RTPVideoHeaderVP9 expected_; | 139 RTPVideoHeaderVP9 expected_; |
140 std::unique_ptr<RtpPacketizerVp9> packetizer_; | 140 std::unique_ptr<RtpPacketizerVp9> packetizer_; |
141 size_t num_packets_; | |
141 | 142 |
142 void Init(size_t payload_size, size_t packet_size) { | 143 void Init(size_t payload_size, size_t packet_size) { |
143 payload_.reset(new uint8_t[payload_size]); | 144 payload_.reset(new uint8_t[payload_size]); |
144 memset(payload_.get(), 7, payload_size); | 145 memset(payload_.get(), 7, payload_size); |
145 payload_size_ = payload_size; | 146 payload_size_ = payload_size; |
146 payload_pos_ = 0; | 147 payload_pos_ = 0; |
147 packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size)); | 148 packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size, |
148 packetizer_->SetPayloadData(payload_.get(), payload_size_, NULL); | 149 /*last_packet_reduction_len=*/0)); |
150 num_packets_ = | |
151 packetizer_->SetPayloadData(payload_.get(), payload_size_, NULL); | |
danilchap
2017/05/17 10:31:20
since you are touching this line anyway, replace N
ilnik
2017/05/17 12:30:55
Done.
| |
149 } | 152 } |
150 | 153 |
151 void CheckPayload(const uint8_t* packet, | 154 void CheckPayload(const uint8_t* packet, |
152 size_t start_pos, | 155 size_t start_pos, |
153 size_t end_pos, | 156 size_t end_pos, |
154 bool last) { | 157 bool last) { |
155 for (size_t i = start_pos; i < end_pos; ++i) { | 158 for (size_t i = start_pos; i < end_pos; ++i) { |
156 EXPECT_EQ(packet[i], payload_[payload_pos_++]); | 159 EXPECT_EQ(packet[i], payload_[payload_pos_++]); |
157 } | 160 } |
158 EXPECT_EQ(last, payload_pos_ == payload_size_); | 161 EXPECT_EQ(last, payload_pos_ == payload_size_); |
159 } | 162 } |
160 | 163 |
161 void CreateParseAndCheckPackets(const size_t* expected_hdr_sizes, | 164 void CreateParseAndCheckPackets(const size_t* expected_hdr_sizes, |
162 const size_t* expected_sizes, | 165 const size_t* expected_sizes, |
163 size_t expected_num_packets) { | 166 size_t expected_num_packets) { |
164 ASSERT_TRUE(packetizer_.get() != NULL); | 167 ASSERT_TRUE(packetizer_.get() != NULL); |
165 bool last = false; | |
166 if (expected_num_packets == 0) { | 168 if (expected_num_packets == 0) { |
167 EXPECT_FALSE(packetizer_->NextPacket(&packet_, &last)); | 169 EXPECT_FALSE(packetizer_->NextPacket(&packet_)); |
168 return; | 170 return; |
169 } | 171 } |
172 EXPECT_EQ(expected_num_packets, num_packets_); | |
170 for (size_t i = 0; i < expected_num_packets; ++i) { | 173 for (size_t i = 0; i < expected_num_packets; ++i) { |
171 EXPECT_TRUE(packetizer_->NextPacket(&packet_, &last)); | 174 EXPECT_TRUE(packetizer_->NextPacket(&packet_)); |
172 auto rtp_payload = packet_.payload(); | 175 auto rtp_payload = packet_.payload(); |
173 EXPECT_EQ(expected_sizes[i], rtp_payload.size()); | 176 EXPECT_EQ(expected_sizes[i], rtp_payload.size()); |
174 RTPVideoHeaderVP9 hdr = expected_; | 177 RTPVideoHeaderVP9 hdr = expected_; |
175 hdr.beginning_of_frame = (i == 0); | 178 hdr.beginning_of_frame = (i == 0); |
176 hdr.end_of_frame = last; | 179 hdr.end_of_frame = (i + 1) == expected_num_packets; |
177 ParseAndCheckPacket(rtp_payload.data(), hdr, expected_hdr_sizes[i], | 180 ParseAndCheckPacket(rtp_payload.data(), hdr, expected_hdr_sizes[i], |
178 rtp_payload.size()); | 181 rtp_payload.size()); |
179 CheckPayload(rtp_payload.data(), expected_hdr_sizes[i], | 182 CheckPayload(rtp_payload.data(), expected_hdr_sizes[i], |
180 rtp_payload.size(), last); | 183 rtp_payload.size(), (i + 1) == expected_num_packets); |
181 } | 184 } |
182 EXPECT_TRUE(last); | |
183 } | 185 } |
184 }; | 186 }; |
185 | 187 |
186 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) { | 188 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) { |
187 const size_t kFrameSize = 25; | 189 const size_t kFrameSize = 25; |
188 const size_t kPacketSize = 26; | 190 const size_t kPacketSize = 26; |
189 Init(kFrameSize, kPacketSize); | 191 Init(kFrameSize, kPacketSize); |
190 | 192 |
191 // One packet: | 193 // One packet: |
192 // I:0, P:0, L:0, F:0, B:1, E:1, V:0 (1hdr + 25 payload) | 194 // I:0, P:0, L:0, F:0, B:1, E:1, V:0 (1hdr + 25 payload) |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7 | 429 // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7 |
428 // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9 | 430 // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9 |
429 const size_t kExpectedHdrSizes[] = {19}; | 431 const size_t kExpectedHdrSizes[] = {19}; |
430 const size_t kExpectedSizes[] = {40}; | 432 const size_t kExpectedSizes[] = {40}; |
431 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes); | 433 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes); |
432 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum); | 434 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum); |
433 } | 435 } |
434 | 436 |
435 TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) { | 437 TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) { |
436 const size_t kFrameSize = 10; | 438 const size_t kFrameSize = 10; |
437 const size_t kPacketSize = 9; // 2 packet per frame. | 439 const size_t kPacketSize = 8; |
440 const size_t kExtensionsLen = 0; | |
danilchap
2017/05/17 10:31:20
prefer kLastPacketReudctionLen name
to avoid false
ilnik
2017/05/17 12:30:56
Done.
| |
441 // Calculated by hand. Headers are 2 bytes. One packet would be 2+10 bytes | |
danilchap
2017/05/17 10:31:20
may be mention which headers (since there are so m
ilnik
2017/05/17 12:30:55
Done.
| |
442 // which is more than packet size. But two packets are enough, since they have | |
443 // capacity of 2*(8-2)=12 bytes. | |
danilchap
2017/05/17 10:31:20
May be:
One packet can contain |kPacketSize| - |kV
ilnik
2017/05/17 12:30:55
Done.
| |
444 const size_t kMinNumberOfPackets = 2; | |
438 const uint8_t kFrame[kFrameSize] = {7}; | 445 const uint8_t kFrame[kFrameSize] = {7}; |
439 const RTPFragmentationHeader* kNoFragmentation = nullptr; | 446 const RTPFragmentationHeader* kNoFragmentation = nullptr; |
440 | 447 |
441 RTPVideoHeaderVP9 vp9_header; | 448 RTPVideoHeaderVP9 vp9_header; |
442 vp9_header.InitRTPVideoHeaderVP9(); | 449 vp9_header.InitRTPVideoHeaderVP9(); |
443 vp9_header.flexible_mode = true; | 450 vp9_header.flexible_mode = true; |
444 vp9_header.num_spatial_layers = 3; | 451 vp9_header.num_spatial_layers = 3; |
445 | 452 |
446 RtpPacketToSend packet(kNoExtensions); | 453 RtpPacketToSend packet(kNoExtensions); |
447 bool last; | |
448 | 454 |
449 vp9_header.spatial_idx = 0; | 455 vp9_header.spatial_idx = 0; |
450 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize); | 456 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, kExtensionsLen); |
451 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 457 EXPECT_EQ( |
452 ASSERT_TRUE(packetizer0.NextPacket(&packet, &last)); | 458 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), |
453 EXPECT_FALSE(last); | 459 kMinNumberOfPackets); |
danilchap
2017/05/17 10:31:20
may be rather than hijacking test designed to chec
ilnik
2017/05/17 12:30:56
Done.
| |
460 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
454 EXPECT_FALSE(packet.Marker()); | 461 EXPECT_FALSE(packet.Marker()); |
455 ASSERT_TRUE(packetizer0.NextPacket(&packet, &last)); | 462 ASSERT_TRUE(packetizer0.NextPacket(&packet)); |
456 EXPECT_TRUE(last); | |
457 EXPECT_FALSE(packet.Marker()); | 463 EXPECT_FALSE(packet.Marker()); |
458 | 464 |
459 vp9_header.spatial_idx = 1; | 465 vp9_header.spatial_idx = 1; |
460 RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize); | 466 RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize, kExtensionsLen); |
461 packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 467 EXPECT_EQ( |
462 ASSERT_TRUE(packetizer1.NextPacket(&packet, &last)); | 468 packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), |
463 EXPECT_FALSE(last); | 469 kMinNumberOfPackets); |
470 ASSERT_TRUE(packetizer1.NextPacket(&packet)); | |
464 EXPECT_FALSE(packet.Marker()); | 471 EXPECT_FALSE(packet.Marker()); |
465 ASSERT_TRUE(packetizer1.NextPacket(&packet, &last)); | 472 ASSERT_TRUE(packetizer1.NextPacket(&packet)); |
466 EXPECT_TRUE(last); | |
467 EXPECT_FALSE(packet.Marker()); | 473 EXPECT_FALSE(packet.Marker()); |
468 | 474 |
469 vp9_header.spatial_idx = 2; | 475 vp9_header.spatial_idx = 2; |
470 RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize); | 476 RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize, kExtensionsLen); |
471 packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 477 EXPECT_EQ( |
472 ASSERT_TRUE(packetizer2.NextPacket(&packet, &last)); | 478 packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), |
473 EXPECT_FALSE(last); | 479 kMinNumberOfPackets); |
480 ASSERT_TRUE(packetizer2.NextPacket(&packet)); | |
474 EXPECT_FALSE(packet.Marker()); | 481 EXPECT_FALSE(packet.Marker()); |
475 ASSERT_TRUE(packetizer2.NextPacket(&packet, &last)); | 482 ASSERT_TRUE(packetizer2.NextPacket(&packet)); |
476 EXPECT_TRUE(last); | |
477 EXPECT_TRUE(packet.Marker()); | 483 EXPECT_TRUE(packet.Marker()); |
478 } | 484 } |
479 | 485 |
486 TEST_F(RtpPacketizerVp9Test, TestRespectsLastPacketReduction) { | |
487 const size_t kFrameSize = 10; | |
488 const size_t kPacketSize = 8; | |
489 const size_t kExtensionsLen = 5; | |
490 // Calculated by hand. Headers are 2 bytes. Like in the test above, 1 packet | |
491 // is not enough. 2 packets would have capacity of (8-2)+(8-2-5)=7 because the | |
492 // last packet has reserved space for extensions. But three packets are | |
493 // enough, since they have capacity of 3*(8-2)-5=13 bytes. | |
494 const size_t kMinNumberOfPackets = 3; | |
495 const uint8_t kFrame[kFrameSize] = {7}; | |
496 const RTPFragmentationHeader* kNoFragmentation = nullptr; | |
497 | |
498 RTPVideoHeaderVP9 vp9_header; | |
499 vp9_header.InitRTPVideoHeaderVP9(); | |
500 vp9_header.flexible_mode = true; | |
501 vp9_header.num_spatial_layers = 3; | |
danilchap
2017/05/17 10:31:20
is number of spatial layers (or presence of this f
ilnik
2017/05/17 12:30:56
No, it's from copy-paste. Removed.
| |
502 | |
503 RtpPacketToSend packet(kNoExtensions); | |
504 | |
505 vp9_header.spatial_idx = 0; | |
506 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, kExtensionsLen); | |
507 EXPECT_EQ( | |
508 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), | |
509 kMinNumberOfPackets); | |
510 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
511 EXPECT_FALSE(packet.Marker()); | |
512 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
513 EXPECT_FALSE(packet.Marker()); | |
514 } | |
515 | |
480 TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) { | 516 TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) { |
481 const size_t kFrameSize = 10; | 517 const size_t kFrameSize = 10; |
482 const size_t kPacketSize = 12; | 518 const size_t kPacketSize = 12; |
483 | 519 |
484 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 10 payload) | 520 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 10 payload) |
485 // L: T:0, U:0, S:0, D:0 | 521 // L: T:0, U:0, S:0, D:0 |
486 expected_.flexible_mode = true; | 522 expected_.flexible_mode = true; |
487 expected_.temporal_idx = 0; | 523 expected_.temporal_idx = 0; |
488 Init(kFrameSize, kPacketSize); | 524 Init(kFrameSize, kPacketSize); |
489 EXPECT_EQ(kProtectedPacket, packetizer_->GetProtectionType()); | 525 EXPECT_EQ(kProtectedPacket, packetizer_->GetProtectionType()); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
730 } | 766 } |
731 | 767 |
732 TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) { | 768 TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) { |
733 const uint8_t kHeaderLength = 1; | 769 const uint8_t kHeaderLength = 1; |
734 uint8_t packet[kHeaderLength] = {0}; | 770 uint8_t packet[kHeaderLength] = {0}; |
735 RtpDepacketizer::ParsedPayload parsed; | 771 RtpDepacketizer::ParsedPayload parsed; |
736 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet))); | 772 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet))); |
737 } | 773 } |
738 | 774 |
739 } // namespace webrtc | 775 } // namespace webrtc |
OLD | NEW |