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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_format_video_generic_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
(Empty)
1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <algorithm>
12 #include <limits>
13 #include <memory>
14 #include <vector>
15
16 #include "webrtc/base/array_view.h"
17 #include "webrtc/modules/include/module_common_types.h"
18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
19 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
20 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
22 #include "webrtc/test/gmock.h"
23 #include "webrtc/test/gtest.h"
24
25 namespace webrtc {
26 namespace {
27
28 using ::testing::ElementsAreArray;
29 using ::testing::Le;
30 using ::testing::SizeIs;
31 using ::testing::Each;
32
33 const size_t kMaxPayloadSize = 1200;
34
35 uint8_t kTestPayload[kMaxPayloadSize];
36
37 std::vector<size_t> NextPacketFillPayloadSizes(
38 RtpPacketizerGeneric* packetizer) {
39 RtpPacketToSend packet(nullptr);
40 std::vector<size_t> result;
41 while (packetizer->NextPacket(&packet)) {
42 result.push_back(packet.payload_size());
43 }
44 return result;
45 }
46
47 size_t GetEffectivePacketsSizeDifference(std::vector<size_t>* payload_sizes,
48 size_t last_packet_reduction_len) {
49 // Account for larger last packet header.
50 payload_sizes->back() += last_packet_reduction_len;
51 auto minmax =
52 std::minmax_element(payload_sizes->begin(), payload_sizes->end());
53 // MAX-MIN
54 size_t difference = *minmax.second - *minmax.first;
55 // Revert temporary changes.
56 payload_sizes->back() -= last_packet_reduction_len;
57 return difference;
58 }
59
60 } // namespace
61
62 TEST(RtpPacketizerVideoGeneric, AllPacketsMayBeEqual_RespectsMaxPayloadSize) {
63 const size_t max_payload_length = 6;
64 const size_t last_packet_reduction_len = 2;
65 const size_t payload_size = 13;
sprang_webrtc 2017/05/17 13:10:07 nit: for constants use kCamelCase style
ilnik 2017/05/17 15:06:33 Done.
danilchap 2017/05/18 11:14:24 fyi: "This convention is optional for variables of
66 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
67 last_packet_reduction_len);
68 size_t num_packets =
69 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
70 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
sprang_webrtc 2017/05/17 13:10:07 nit: for simpler types, prefer explicit type rathe
ilnik 2017/05/17 15:06:33 Done.
71 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
72
73 EXPECT_THAT(payload_sizes, Each(Le(max_payload_length)));
74 }
75
76 TEST(RtpPacketizerVideoGeneric,
77 AllPacketsMayBeEqual_RespectsLastPacketReductionLength) {
78 const size_t max_payload_length = 6;
79 const size_t last_packet_reduction_len = 2;
80 const size_t payload_size = 13;
81 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
82 last_packet_reduction_len);
83 size_t num_packets =
84 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
85 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
86 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
87
88 EXPECT_LE(payload_sizes.back(),
89 max_payload_length - last_packet_reduction_len);
90 }
91
92 TEST(RtpPacketizerVideoGeneric,
93 AllPacketsMayBeEqual_MakesPacketsAlmostEqualInSize) {
94 const size_t max_payload_length = 6;
95 const size_t last_packet_reduction_len = 2;
96 const size_t payload_size = 13;
97 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
98 last_packet_reduction_len);
99 size_t num_packets =
100 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
101 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
102 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
103
104 size_t sizes_difference = GetEffectivePacketsSizeDifference(
105 &payload_sizes, last_packet_reduction_len);
106 EXPECT_LE(sizes_difference, 1u);
107 }
108
109 TEST(RtpPacketizerVideoGeneric,
110 AllPacketsMayBeEqual_GeneratesMinimumNumberOfPackets) {
111 const size_t max_payload_length = 6;
112 const size_t last_packet_reduction_len = 3;
113 const size_t payload_size = 13;
114 // Computed by hand. 3 packets would have capacity 3*(6-1)-3=12 (max length -
115 // generic header lengh for each packet minus last packet reduction).
116 // 4 packets is enough for payload_size.
117 const size_t min_num_packets = 4;
118 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
119 last_packet_reduction_len);
120 size_t num_packets =
121 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
122 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
123 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
124
125 EXPECT_EQ(num_packets, min_num_packets);
126 }
127
128 TEST(RtpPacketizerVideoGeneric, SomePacketsAreSmaller_RespectsMaxPayloadSize) {
129 const size_t max_payload_length = 8;
130 const size_t last_packet_reduction_len = 5;
131 const size_t payload_size = 28;
132 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
133 last_packet_reduction_len);
134 size_t num_packets =
135 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
136 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
137 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
138
139 EXPECT_THAT(payload_sizes, Each(Le(max_payload_length)));
140 }
141
142 TEST(RtpPacketizerVideoGeneric,
143 SomePacketsAreSmaller_RespectsLastPacketReductionLength) {
144 const size_t max_payload_length = 8;
145 const size_t last_packet_reduction_len = 5;
146 const size_t payload_size = 28;
147 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
148 last_packet_reduction_len);
149 size_t num_packets =
150 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
151 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
152 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
153
154 EXPECT_LE(payload_sizes.back(),
155 max_payload_length - last_packet_reduction_len);
156 }
157
158 TEST(RtpPacketizerVideoGeneric,
159 SomePacketsAreSmaller_MakesPacketsAlmostEqualInSize) {
160 const size_t max_payload_length = 8;
161 const size_t last_packet_reduction_len = 5;
162 const size_t payload_size = 28;
163 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
164 last_packet_reduction_len);
165 size_t num_packets =
166 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
167 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
168 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
169
170 size_t sizes_difference = GetEffectivePacketsSizeDifference(
171 &payload_sizes, last_packet_reduction_len);
172 EXPECT_LE(sizes_difference, 1u);
173 }
174
175 TEST(RtpPacketizerVideoGeneric,
176 SomePacketsAreSmaller_GeneratesMinimumNumberOfPackets) {
177 const size_t max_payload_length = 8;
178 const size_t last_packet_reduction_len = 5;
179 const size_t payload_size = 28;
180 // Computed by hand. 4 packets would have capacity 4*(8-1)-5=23 (max length -
181 // generic header lengh for each packet minus last packet reduction).
182 // 5 packets is enough for payload_size.
183 const size_t min_num_packets = 5;
184 RtpPacketizerGeneric packetizer(kVideoFrameKey, max_payload_length,
185 last_packet_reduction_len);
186 size_t num_packets =
187 packetizer.SetPayloadData(kTestPayload, payload_size, nullptr);
188 auto payload_sizes = NextPacketFillPayloadSizes(&packetizer);
189 EXPECT_THAT(payload_sizes, SizeIs(num_packets));
190
191 EXPECT_EQ(num_packets, min_num_packets);
192 }
193
194 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698