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_, nullptr); | |
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); |
184 expected_.ss_data_available = false; | |
181 } | 185 } |
182 EXPECT_TRUE(last); | |
183 } | 186 } |
184 }; | 187 }; |
185 | 188 |
186 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) { | 189 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) { |
187 const size_t kFrameSize = 25; | 190 const size_t kFrameSize = 25; |
188 const size_t kPacketSize = 26; | 191 const size_t kPacketSize = 26; |
189 Init(kFrameSize, kPacketSize); | 192 Init(kFrameSize, kPacketSize); |
190 | 193 |
191 // One packet: | 194 // One packet: |
192 // I:0, P:0, L:0, F:0, B:1, E:1, V:0 (1hdr + 25 payload) | 195 // I:0, P:0, L:0, F:0, B:1, E:1, V:0 (1hdr + 25 payload) |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 // N_G:3 | 428 // N_G:3 |
426 // T:0, U:1, R:0 | 429 // T:0, U:1, R:0 |
427 // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7 | 430 // 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 | 431 // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9 |
429 const size_t kExpectedHdrSizes[] = {19}; | 432 const size_t kExpectedHdrSizes[] = {19}; |
430 const size_t kExpectedSizes[] = {40}; | 433 const size_t kExpectedSizes[] = {40}; |
431 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes); | 434 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes); |
432 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum); | 435 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum); |
433 } | 436 } |
434 | 437 |
438 TEST_F(RtpPacketizerVp9Test, TestSsDataDoesNotFitInAveragePacket) { | |
439 const size_t kFrameSize = 24; | |
440 const size_t kPacketSize = 20; | |
441 | |
442 expected_.ss_data_available = true; | |
443 expected_.num_spatial_layers = 2; | |
444 expected_.spatial_layer_resolution_present = true; | |
445 expected_.width[0] = 640; | |
446 expected_.width[1] = 1280; | |
447 expected_.height[0] = 360; | |
448 expected_.height[1] = 720; | |
449 expected_.gof.num_frames_in_gof = 3; | |
450 expected_.gof.temporal_idx[0] = 0; | |
451 expected_.gof.temporal_idx[1] = 1; | |
452 expected_.gof.temporal_idx[2] = 2; | |
453 expected_.gof.temporal_up_switch[0] = true; | |
454 expected_.gof.temporal_up_switch[1] = true; | |
455 expected_.gof.temporal_up_switch[2] = false; | |
456 expected_.gof.num_ref_pics[0] = 0; | |
457 expected_.gof.num_ref_pics[1] = 3; | |
458 expected_.gof.num_ref_pics[2] = 2; | |
459 expected_.gof.pid_diff[1][0] = 5; | |
460 expected_.gof.pid_diff[1][1] = 6; | |
461 expected_.gof.pid_diff[1][2] = 7; | |
462 expected_.gof.pid_diff[2][0] = 8; | |
463 expected_.gof.pid_diff[2][1] = 9; | |
464 Init(kFrameSize, kPacketSize); | |
465 | |
466 // Three packets: | |
467 // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (19hdr + 1 payload) | |
468 // N_S:1, Y:1, G:1 | |
469 // WIDTH:640 // 2 bytes | |
470 // HEIGHT:360 // 2 bytes | |
471 // WIDTH:1280 // 2 bytes | |
472 // HEIGHT:720 // 2 bytes | |
473 // N_G:3 | |
474 // T:0, U:1, R:0 | |
475 // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7 | |
476 // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9 | |
477 // Last two packets 1 bytes vp9 hdrs and the rest of payload 14 and 9 bytes. | |
478 const size_t kExpectedHdrSizes[] = {19, 1, 1}; | |
479 const size_t kExpectedSizes[] = {20, 15, 10}; | |
480 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes); | |
danilchap
2017/05/17 13:21:54
is it different from arraysize macro from base/arr
ilnik
2017/05/17 15:06:34
I have no idea. It's used everythere in that file,
| |
481 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum); | |
482 } | |
483 | |
435 TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) { | 484 TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) { |
436 const size_t kFrameSize = 10; | 485 const size_t kFrameSize = 10; |
437 const size_t kPacketSize = 9; // 2 packet per frame. | 486 const size_t kPacketSize = 8; |
487 const size_t kLastPacketReductionLen = 0; | |
438 const uint8_t kFrame[kFrameSize] = {7}; | 488 const uint8_t kFrame[kFrameSize] = {7}; |
439 const RTPFragmentationHeader* kNoFragmentation = nullptr; | 489 const RTPFragmentationHeader* kNoFragmentation = nullptr; |
440 | 490 |
441 RTPVideoHeaderVP9 vp9_header; | 491 RTPVideoHeaderVP9 vp9_header; |
442 vp9_header.InitRTPVideoHeaderVP9(); | 492 vp9_header.InitRTPVideoHeaderVP9(); |
443 vp9_header.flexible_mode = true; | 493 vp9_header.flexible_mode = true; |
444 vp9_header.num_spatial_layers = 3; | 494 vp9_header.num_spatial_layers = 3; |
445 | 495 |
446 RtpPacketToSend packet(kNoExtensions); | 496 RtpPacketToSend packet(kNoExtensions); |
447 bool last; | |
448 | 497 |
449 vp9_header.spatial_idx = 0; | 498 vp9_header.spatial_idx = 0; |
450 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize); | 499 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, |
500 kLastPacketReductionLen); | |
451 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 501 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); |
452 ASSERT_TRUE(packetizer0.NextPacket(&packet, &last)); | 502 ASSERT_TRUE(packetizer0.NextPacket(&packet)); |
453 EXPECT_FALSE(last); | |
454 EXPECT_FALSE(packet.Marker()); | 503 EXPECT_FALSE(packet.Marker()); |
455 ASSERT_TRUE(packetizer0.NextPacket(&packet, &last)); | 504 ASSERT_TRUE(packetizer0.NextPacket(&packet)); |
456 EXPECT_TRUE(last); | |
457 EXPECT_FALSE(packet.Marker()); | 505 EXPECT_FALSE(packet.Marker()); |
458 | 506 |
459 vp9_header.spatial_idx = 1; | 507 vp9_header.spatial_idx = 1; |
460 RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize); | 508 RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize, |
509 kLastPacketReductionLen); | |
461 packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 510 packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); |
462 ASSERT_TRUE(packetizer1.NextPacket(&packet, &last)); | 511 ASSERT_TRUE(packetizer1.NextPacket(&packet)); |
463 EXPECT_FALSE(last); | |
464 EXPECT_FALSE(packet.Marker()); | 512 EXPECT_FALSE(packet.Marker()); |
465 ASSERT_TRUE(packetizer1.NextPacket(&packet, &last)); | 513 ASSERT_TRUE(packetizer1.NextPacket(&packet)); |
466 EXPECT_TRUE(last); | |
467 EXPECT_FALSE(packet.Marker()); | 514 EXPECT_FALSE(packet.Marker()); |
468 | 515 |
469 vp9_header.spatial_idx = 2; | 516 vp9_header.spatial_idx = 2; |
470 RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize); | 517 RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize, |
518 kLastPacketReductionLen); | |
471 packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); | 519 packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation); |
472 ASSERT_TRUE(packetizer2.NextPacket(&packet, &last)); | 520 ASSERT_TRUE(packetizer2.NextPacket(&packet)); |
473 EXPECT_FALSE(last); | |
474 EXPECT_FALSE(packet.Marker()); | 521 EXPECT_FALSE(packet.Marker()); |
475 ASSERT_TRUE(packetizer2.NextPacket(&packet, &last)); | 522 ASSERT_TRUE(packetizer2.NextPacket(&packet)); |
476 EXPECT_TRUE(last); | |
477 EXPECT_TRUE(packet.Marker()); | 523 EXPECT_TRUE(packet.Marker()); |
478 } | 524 } |
479 | 525 |
526 TEST_F(RtpPacketizerVp9Test, TestGeneratesMinimumNumberOfPackets) { | |
527 const size_t kFrameSize = 10; | |
528 const size_t kPacketSize = 8; | |
529 const size_t kLastPacketReductionLen = 0; | |
530 // Calculated by hand. One packet can contain | |
531 // |kPacketSize| - |kVp9MinDiscriptorSize| = 6 bytes of the frame payload, | |
532 // thus to fit 10 bytes two packets are required. | |
533 const size_t kMinNumberOfPackets = 2; | |
534 const uint8_t kFrame[kFrameSize] = {7}; | |
535 const RTPFragmentationHeader* kNoFragmentation = nullptr; | |
536 | |
537 RTPVideoHeaderVP9 vp9_header; | |
538 vp9_header.InitRTPVideoHeaderVP9(); | |
539 | |
540 RtpPacketToSend packet(kNoExtensions); | |
541 | |
542 RtpPacketizerVp9 packetizer(vp9_header, kPacketSize, kLastPacketReductionLen); | |
543 EXPECT_EQ(packetizer.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), | |
544 kMinNumberOfPackets); | |
545 ASSERT_TRUE(packetizer.NextPacket(&packet)); | |
546 EXPECT_FALSE(packet.Marker()); | |
danilchap
2017/05/17 13:21:54
why testing Marker bit?
ilnik
2017/05/17 15:06:34
It wouldn't hurt. Additional check that everything
| |
547 ASSERT_TRUE(packetizer.NextPacket(&packet)); | |
548 EXPECT_TRUE(packet.Marker()); | |
549 } | |
550 | |
551 TEST_F(RtpPacketizerVp9Test, TestRespectsLastPacketReductionLen) { | |
552 const size_t kFrameSize = 10; | |
553 const size_t kPacketSize = 8; | |
554 const size_t kLastPacketReductionLen = 5; | |
555 // Calculated by hand. VP9 payload descriptor is 2 bytes. Like in the test | |
556 // above, 1 packet is not enough. 2 packets can contain | |
557 // 2*(|kPacketSize| - |kVp9MinDiscriptorSize|) - |kLastPacketReductionLen| = 7 | |
558 // But three packets are enough, since they have capacity of 3*(8-2)-5=13 | |
559 // bytes. | |
560 const size_t kMinNumberOfPackets = 3; | |
561 const uint8_t kFrame[kFrameSize] = {7}; | |
562 const RTPFragmentationHeader* kNoFragmentation = nullptr; | |
563 | |
564 RTPVideoHeaderVP9 vp9_header; | |
565 vp9_header.InitRTPVideoHeaderVP9(); | |
566 vp9_header.flexible_mode = true; | |
567 | |
568 RtpPacketToSend packet(kNoExtensions); | |
569 | |
570 RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, | |
571 kLastPacketReductionLen); | |
572 EXPECT_EQ( | |
573 packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation), | |
574 kMinNumberOfPackets); | |
575 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
576 EXPECT_FALSE(packet.Marker()); | |
577 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
578 EXPECT_FALSE(packet.Marker()); | |
579 ASSERT_TRUE(packetizer0.NextPacket(&packet)); | |
580 EXPECT_TRUE(packet.Marker()); | |
581 } | |
582 | |
480 TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) { | 583 TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) { |
481 const size_t kFrameSize = 10; | 584 const size_t kFrameSize = 10; |
482 const size_t kPacketSize = 12; | 585 const size_t kPacketSize = 12; |
483 | 586 |
484 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 10 payload) | 587 // 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 | 588 // L: T:0, U:0, S:0, D:0 |
486 expected_.flexible_mode = true; | 589 expected_.flexible_mode = true; |
487 expected_.temporal_idx = 0; | 590 expected_.temporal_idx = 0; |
488 Init(kFrameSize, kPacketSize); | 591 Init(kFrameSize, kPacketSize); |
489 EXPECT_EQ(kProtectedPacket, packetizer_->GetProtectionType()); | 592 EXPECT_EQ(kProtectedPacket, packetizer_->GetProtectionType()); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
730 } | 833 } |
731 | 834 |
732 TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) { | 835 TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) { |
733 const uint8_t kHeaderLength = 1; | 836 const uint8_t kHeaderLength = 1; |
734 uint8_t packet[kHeaderLength] = {0}; | 837 uint8_t packet[kHeaderLength] = {0}; |
735 RtpDepacketizer::ParsedPayload parsed; | 838 RtpDepacketizer::ParsedPayload parsed; |
736 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet))); | 839 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet))); |
737 } | 840 } |
738 | 841 |
739 } // namespace webrtc | 842 } // namespace webrtc |
OLD | NEW |