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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc

Issue 2871173008: Fix packetization logic to leave space for extensions in the last packet (Closed)
Patch Set: Implemented Danilchap@ comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698