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

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_, 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698