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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
index c53a2ca5a2f112097060eca3b79af1077ecc4ea6..261638fc4171e2ec3b032e337ccd4201de0e0f82 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
@@ -138,14 +138,17 @@ class RtpPacketizerVp9Test : public ::testing::Test {
size_t payload_pos_;
RTPVideoHeaderVP9 expected_;
std::unique_ptr<RtpPacketizerVp9> packetizer_;
+ size_t num_packets_;
void Init(size_t payload_size, size_t packet_size) {
payload_.reset(new uint8_t[payload_size]);
memset(payload_.get(), 7, payload_size);
payload_size_ = payload_size;
payload_pos_ = 0;
- packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size));
- packetizer_->SetPayloadData(payload_.get(), payload_size_, NULL);
+ packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size,
+ /*last_packet_reduction_len=*/0));
+ num_packets_ =
+ 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.
}
void CheckPayload(const uint8_t* packet,
@@ -162,24 +165,23 @@ class RtpPacketizerVp9Test : public ::testing::Test {
const size_t* expected_sizes,
size_t expected_num_packets) {
ASSERT_TRUE(packetizer_.get() != NULL);
- bool last = false;
if (expected_num_packets == 0) {
- EXPECT_FALSE(packetizer_->NextPacket(&packet_, &last));
+ EXPECT_FALSE(packetizer_->NextPacket(&packet_));
return;
}
+ EXPECT_EQ(expected_num_packets, num_packets_);
for (size_t i = 0; i < expected_num_packets; ++i) {
- EXPECT_TRUE(packetizer_->NextPacket(&packet_, &last));
+ EXPECT_TRUE(packetizer_->NextPacket(&packet_));
auto rtp_payload = packet_.payload();
EXPECT_EQ(expected_sizes[i], rtp_payload.size());
RTPVideoHeaderVP9 hdr = expected_;
hdr.beginning_of_frame = (i == 0);
- hdr.end_of_frame = last;
+ hdr.end_of_frame = (i + 1) == expected_num_packets;
ParseAndCheckPacket(rtp_payload.data(), hdr, expected_hdr_sizes[i],
rtp_payload.size());
CheckPayload(rtp_payload.data(), expected_hdr_sizes[i],
- rtp_payload.size(), last);
+ rtp_payload.size(), (i + 1) == expected_num_packets);
}
- EXPECT_TRUE(last);
}
};
@@ -434,7 +436,12 @@ TEST_F(RtpPacketizerVp9Test, TestSsData) {
TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) {
const size_t kFrameSize = 10;
- const size_t kPacketSize = 9; // 2 packet per frame.
+ const size_t kPacketSize = 8;
+ 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.
+ // 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.
+ // which is more than packet size. But two packets are enough, since they have
+ // 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.
+ const size_t kMinNumberOfPackets = 2;
const uint8_t kFrame[kFrameSize] = {7};
const RTPFragmentationHeader* kNoFragmentation = nullptr;
@@ -444,39 +451,68 @@ TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) {
vp9_header.num_spatial_layers = 3;
RtpPacketToSend packet(kNoExtensions);
- bool last;
vp9_header.spatial_idx = 0;
- RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize);
- packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
- ASSERT_TRUE(packetizer0.NextPacket(&packet, &last));
- EXPECT_FALSE(last);
+ RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, kExtensionsLen);
+ EXPECT_EQ(
+ packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation),
+ 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.
+ ASSERT_TRUE(packetizer0.NextPacket(&packet));
EXPECT_FALSE(packet.Marker());
- ASSERT_TRUE(packetizer0.NextPacket(&packet, &last));
- EXPECT_TRUE(last);
+ ASSERT_TRUE(packetizer0.NextPacket(&packet));
EXPECT_FALSE(packet.Marker());
vp9_header.spatial_idx = 1;
- RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize);
- packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
- ASSERT_TRUE(packetizer1.NextPacket(&packet, &last));
- EXPECT_FALSE(last);
+ RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize, kExtensionsLen);
+ EXPECT_EQ(
+ packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation),
+ kMinNumberOfPackets);
+ ASSERT_TRUE(packetizer1.NextPacket(&packet));
EXPECT_FALSE(packet.Marker());
- ASSERT_TRUE(packetizer1.NextPacket(&packet, &last));
- EXPECT_TRUE(last);
+ ASSERT_TRUE(packetizer1.NextPacket(&packet));
EXPECT_FALSE(packet.Marker());
vp9_header.spatial_idx = 2;
- RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize);
- packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
- ASSERT_TRUE(packetizer2.NextPacket(&packet, &last));
- EXPECT_FALSE(last);
+ RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize, kExtensionsLen);
+ EXPECT_EQ(
+ packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation),
+ kMinNumberOfPackets);
+ ASSERT_TRUE(packetizer2.NextPacket(&packet));
EXPECT_FALSE(packet.Marker());
- ASSERT_TRUE(packetizer2.NextPacket(&packet, &last));
- EXPECT_TRUE(last);
+ ASSERT_TRUE(packetizer2.NextPacket(&packet));
EXPECT_TRUE(packet.Marker());
}
+TEST_F(RtpPacketizerVp9Test, TestRespectsLastPacketReduction) {
+ const size_t kFrameSize = 10;
+ const size_t kPacketSize = 8;
+ const size_t kExtensionsLen = 5;
+ // Calculated by hand. Headers are 2 bytes. Like in the test above, 1 packet
+ // is not enough. 2 packets would have capacity of (8-2)+(8-2-5)=7 because the
+ // last packet has reserved space for extensions. But three packets are
+ // enough, since they have capacity of 3*(8-2)-5=13 bytes.
+ const size_t kMinNumberOfPackets = 3;
+ const uint8_t kFrame[kFrameSize] = {7};
+ const RTPFragmentationHeader* kNoFragmentation = nullptr;
+
+ RTPVideoHeaderVP9 vp9_header;
+ vp9_header.InitRTPVideoHeaderVP9();
+ vp9_header.flexible_mode = true;
+ 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.
+
+ RtpPacketToSend packet(kNoExtensions);
+
+ vp9_header.spatial_idx = 0;
+ RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize, kExtensionsLen);
+ EXPECT_EQ(
+ packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation),
+ kMinNumberOfPackets);
+ ASSERT_TRUE(packetizer0.NextPacket(&packet));
+ EXPECT_FALSE(packet.Marker());
+ ASSERT_TRUE(packetizer0.NextPacket(&packet));
+ EXPECT_FALSE(packet.Marker());
+}
+
TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) {
const size_t kFrameSize = 10;
const size_t kPacketSize = 12;

Powered by Google App Engine
This is Rietveld 408576698