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

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 Sprang@ and 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;
danilchap 2017/05/18 11:14:24 may be sort usings alphabetically
ilnik 2017/05/18 12:22:52 Done.
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>* kPayloadSizes,
danilchap 2017/05/18 11:14:24 "The names of variables (including function parame
ilnik 2017/05/18 12:42:19 Done.
48 size_t kLastPacketReductionLen) {
49 // Account for larger last packet header.
50 kPayloadSizes->back() += kLastPacketReductionLen;
51 auto minmax =
52 std::minmax_element(kPayloadSizes->begin(), kPayloadSizes->end());
53 // MAX-MIN
54 size_t difference = *minmax.second - *minmax.first;
55 // Revert temporary changes.
56 kPayloadSizes->back() -= kLastPacketReductionLen;
57 return difference;
58 }
59
60 } // namespace
61
62 TEST(RtpPacketizerVideoGeneric, AllPacketsMayBeEqual_RespectsMaxPayloadSize) {
63 const size_t kMaxPayloadLen = 6;
64 const size_t kLastPacketReductionLen = 2;
65 const size_t kPayloadSize = 13;
66 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
67 kLastPacketReductionLen);
68 size_t num_packets =
69 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
70 std::vector<size_t> kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
danilchap 2017/05/18 11:14:24 do not name variable payload_sizes as a constant.
ilnik 2017/05/18 12:22:52 Done.
71 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
72
73 EXPECT_THAT(kPayloadSizes, Each(Le(kMaxPayloadLen)));
74 }
75
76 TEST(RtpPacketizerVideoGeneric,
77 AllPacketsMayBeEqual_RespectsLastPacketReductionLength) {
78 const size_t kMaxPayloadLen = 6;
79 const size_t kLastPacketReductionLen = 2;
80 const size_t kPayloadSize = 13;
81 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
82 kLastPacketReductionLen);
83 size_t num_packets =
84 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
85 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
86 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
87
88 EXPECT_LE(kPayloadSizes.back(), kMaxPayloadLen - kLastPacketReductionLen);
89 }
90
91 TEST(RtpPacketizerVideoGeneric,
92 AllPacketsMayBeEqual_MakesPacketsAlmostEqualInSize) {
93 const size_t kMaxPayloadLen = 6;
94 const size_t kLastPacketReductionLen = 2;
95 const size_t kPayloadSize = 13;
96 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
97 kLastPacketReductionLen);
98 size_t num_packets =
99 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
100 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
101 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
102
103 size_t sizes_difference = GetEffectivePacketsSizeDifference(
104 &kPayloadSizes, kLastPacketReductionLen);
105 EXPECT_LE(sizes_difference, 1u);
106 }
107
108 TEST(RtpPacketizerVideoGeneric,
109 AllPacketsMayBeEqual_GeneratesMinimumNumberOfPackets) {
110 const size_t kMaxPayloadLen = 6;
111 const size_t kLastPacketReductionLen = 3;
112 const size_t kPayloadSize = 13;
113 // Computed by hand. 3 packets would have capacity 3*(6-1)-3=12 (max length -
114 // generic header lengh for each packet minus last packet reduction).
115 // 4 packets is enough for kPayloadSize.
116 const size_t kMinNumPackets = 4;
117 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
118 kLastPacketReductionLen);
119 size_t num_packets =
120 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
121 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
122 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
123
124 EXPECT_EQ(num_packets, kMinNumPackets);
125 }
126
127 TEST(RtpPacketizerVideoGeneric, SomePacketsAreSmaller_RespectsMaxPayloadSize) {
128 const size_t kMaxPayloadLen = 8;
129 const size_t kLastPacketReductionLen = 5;
130 const size_t kPayloadSize = 28;
131 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
132 kLastPacketReductionLen);
133 size_t num_packets =
134 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
135 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
136 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
137
138 EXPECT_THAT(kPayloadSizes, Each(Le(kMaxPayloadLen)));
139 }
140
141 TEST(RtpPacketizerVideoGeneric,
142 SomePacketsAreSmaller_RespectsLastPacketReductionLength) {
143 const size_t kMaxPayloadLen = 8;
144 const size_t kLastPacketReductionLen = 5;
145 const size_t kPayloadSize = 28;
146 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
147 kLastPacketReductionLen);
148 size_t num_packets =
149 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
150 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
151 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
152
153 EXPECT_LE(kPayloadSizes.back(), kMaxPayloadLen - kLastPacketReductionLen);
154 }
155
156 TEST(RtpPacketizerVideoGeneric,
157 SomePacketsAreSmaller_MakesPacketsAlmostEqualInSize) {
158 const size_t kMaxPayloadLen = 8;
159 const size_t kLastPacketReductionLen = 5;
160 const size_t kPayloadSize = 28;
161 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
162 kLastPacketReductionLen);
163 size_t num_packets =
164 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
165 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
166 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
167
168 size_t sizes_difference = GetEffectivePacketsSizeDifference(
169 &kPayloadSizes, kLastPacketReductionLen);
170 EXPECT_LE(sizes_difference, 1u);
171 }
172
173 TEST(RtpPacketizerVideoGeneric,
174 SomePacketsAreSmaller_GeneratesMinimumNumberOfPackets) {
175 const size_t kMaxPayloadLen = 8;
176 const size_t kLastPacketReductionLen = 5;
177 const size_t kPayloadSize = 28;
178 // Computed by hand. 4 packets would have capacity 4*(8-1)-5=23 (max length -
179 // generic header lengh for each packet minus last packet reduction).
180 // 5 packets is enough for kPayloadSize.
181 const size_t kMinNumPackets = 5;
182 RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
183 kLastPacketReductionLen);
184 size_t num_packets =
185 packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
186 auto kPayloadSizes = NextPacketFillPayloadSizes(&packetizer);
187 EXPECT_THAT(kPayloadSizes, SizeIs(num_packets));
188
189 EXPECT_EQ(num_packets, kMinNumPackets);
190 }
191
192 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698