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

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

Issue 2269903002: Add FlexFEC header formatters. (pt. 5) (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@header_reader_writer-pt4-generalize_header_formatting
Patch Set: Review response 3. Created 4 years, 3 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) 2016 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 <string.h>
12
13 #include <memory>
14 #include <utility>
15
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webrtc/base/basictypes.h"
18 #include "webrtc/base/checks.h"
19 #include "webrtc/base/random.h"
20 #include "webrtc/base/scoped_ref_ptr.h"
21 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
22 #include "webrtc/modules/rtp_rtcp/source/flexfec_header_reader_writer.h"
23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
24 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
25
26 namespace webrtc {
27
28 namespace {
29
30 using Packet = ::webrtc::ForwardErrorCorrection::Packet;
31 using ReceivedFecPacket = ::webrtc::ForwardErrorCorrection::ReceivedFecPacket;
32
33 constexpr uint32_t kMediaSsrc = 1254983;
34 constexpr uint16_t kMediaStartSeqNum = 825;
35 constexpr size_t kMediaPacketLength = 1234;
36 constexpr uint32_t kFlexfecSsrc = 52142;
37
38 // Assume single-stream protection.
39 constexpr size_t kFlexfecHeaderSize0KBitsSet = 20;
40 constexpr size_t kFlexfecHeaderSize1KBitsSet = 24;
41 constexpr size_t kFlexfecHeaderSize2KBitsSet = 32;
brandtr 2016/09/14 11:45:54 See comment in implementation file.
42 constexpr size_t kFlexfecPacketMaskOffset = 18;
43 constexpr size_t kFlexfecPacketMaskSize0KBitsSet = 2;
44 constexpr size_t kFlexfecPacketMaskSize1KBitsSet = 6;
45 constexpr size_t kFlexfecPacketMaskSize2KBitsSet = 14;
46 constexpr size_t kFlexfecMaxPacketSize = kFlexfecPacketMaskSize2KBitsSet;
47
48 std::unique_ptr<uint8_t[]> GeneratePacketMask(size_t packet_mask_size,
49 uint64_t seed) {
50 Random random(seed);
51 std::unique_ptr<uint8_t[]> packet_mask(new uint8_t[kFlexfecMaxPacketSize]);
52 memset(packet_mask.get(), 0, kFlexfecMaxPacketSize);
53 for (size_t i = 0; i < packet_mask_size; ++i) {
54 packet_mask[i] = random.Rand<uint8_t>();
55 }
56 return packet_mask;
57 }
58
59 void ClearBit(size_t index, uint8_t* packet_mask) {
60 packet_mask[index / 8] &= ~(1 << (7 - index % 8));
61 }
62
63 void SetBit(size_t index, uint8_t* packet_mask) {
64 packet_mask[index / 8] |= (1 << (7 - index % 8));
65 }
66
67 rtc::scoped_refptr<Packet> WriteHeader(const uint8_t* packet_mask,
68 size_t packet_mask_size) {
69 FlexfecHeaderWriter writer;
70 rtc::scoped_refptr<Packet> written_packet(new Packet());
71 written_packet->length = kMediaPacketLength;
72 for (size_t i = 0; i < written_packet->length; ++i) {
73 written_packet->data[i] = i; // Actual content doesn't matter.
74 }
75 writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, packet_mask,
76 packet_mask_size, written_packet.get());
77 return written_packet;
78 }
79
80 std::unique_ptr<ReceivedFecPacket> ReadHeader(const Packet& written_packet) {
81 FlexfecHeaderReader reader;
82 std::unique_ptr<ReceivedFecPacket> read_packet(new ReceivedFecPacket());
83 read_packet->ssrc = kFlexfecSsrc;
84 read_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
85 memcpy(read_packet->pkt->data, written_packet.data, written_packet.length);
86 read_packet->pkt->length = written_packet.length;
87 EXPECT_TRUE(reader.ReadFecHeader(read_packet.get()));
88 return read_packet;
89 }
90
91 void VerifyHeaders(size_t expected_fec_header_size,
92 const uint8_t* expected_packet_mask,
93 size_t expected_packet_mask_size,
94 const Packet& written_packet,
95 const ReceivedFecPacket& read_packet) {
96 EXPECT_EQ(kFlexfecSsrc, read_packet.ssrc);
97 EXPECT_EQ(expected_fec_header_size, read_packet.fec_header_size);
98 EXPECT_EQ(kMediaSsrc, read_packet.protected_ssrc);
99 EXPECT_EQ(kMediaStartSeqNum, read_packet.seq_num_base);
100 EXPECT_EQ(kFlexfecPacketMaskOffset, read_packet.packet_mask_offset);
101 ASSERT_EQ(expected_packet_mask_size, read_packet.packet_mask_size);
102 EXPECT_EQ(written_packet.length - expected_fec_header_size,
103 read_packet.protection_length);
104 // Verify that the call to ReadFecHeader did normalize the packet masks.
105 EXPECT_EQ(0, memcmp(expected_packet_mask,
106 &read_packet.pkt->data[read_packet.packet_mask_offset],
107 read_packet.packet_mask_size));
108 // Verify that the call to ReadFecHeader did not tamper with the payload.
109 EXPECT_EQ(0, memcmp(&written_packet.data[expected_fec_header_size],
110 &read_packet.pkt->data[expected_fec_header_size],
111 written_packet.length - expected_fec_header_size));
112 }
113
114 } // namespace
115
116 TEST(FlexfecHeaderReaderWriterTest,
117 ContractsShortUlpfecPacketMaskWithBit15Clear) {
118 FlexfecHeaderWriter writer;
119 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
120 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
121 ClearBit(15, packet_mask.get());
122 size_t min_packet_mask_size =
123 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
124 EXPECT_EQ(kFlexfecPacketMaskSize0KBitsSet, min_packet_mask_size);
125 EXPECT_EQ(kFlexfecHeaderSize0KBitsSet,
126 writer.FecHeaderSize(min_packet_mask_size));
127 }
128
129 TEST(FlexfecHeaderReaderWriterTest, ExpandsShortUlpfecPacketMaskWithBit15Set) {
130 FlexfecHeaderWriter writer;
131 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
132 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
133 SetBit(15, packet_mask.get());
134 size_t min_packet_mask_size =
135 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
136 EXPECT_EQ(kFlexfecPacketMaskSize1KBitsSet, min_packet_mask_size);
137 EXPECT_EQ(kFlexfecHeaderSize1KBitsSet,
138 writer.FecHeaderSize(min_packet_mask_size));
139 }
140
141 TEST(FlexfecHeaderReaderWriterTest,
142 ContractsLongUlpfecPacketMaskWithBits46And47Clear) {
143 FlexfecHeaderWriter writer;
144 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
145 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
146 ClearBit(46, packet_mask.get());
147 ClearBit(47, packet_mask.get());
148 size_t min_packet_mask_size =
149 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
150 EXPECT_EQ(kFlexfecPacketMaskSize1KBitsSet, min_packet_mask_size);
151 EXPECT_EQ(kFlexfecHeaderSize1KBitsSet,
152 writer.FecHeaderSize(min_packet_mask_size));
153 }
154
155 TEST(FlexfecHeaderReaderWriterTest,
156 ExpandsLongUlpfecPacketMaskWithBits46And47Clear) {
157 FlexfecHeaderWriter writer;
158 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
159 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
160 SetBit(46, packet_mask.get());
161 ClearBit(47, packet_mask.get());
162 size_t min_packet_mask_size =
163 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
164 EXPECT_EQ(kFlexfecPacketMaskSize2KBitsSet, min_packet_mask_size);
165 EXPECT_EQ(kFlexfecHeaderSize2KBitsSet,
166 writer.FecHeaderSize(min_packet_mask_size));
167 }
168
169 TEST(FlexfecHeaderReaderWriterTest,
170 ExpandsLongUlpfecPacketMaskWithBit46ClearBit47Set) {
171 FlexfecHeaderWriter writer;
172 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
173 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
174 ClearBit(46, packet_mask.get());
175 SetBit(47, packet_mask.get());
176 size_t min_packet_mask_size =
177 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
178 EXPECT_EQ(kFlexfecPacketMaskSize2KBitsSet, min_packet_mask_size);
179 EXPECT_EQ(kFlexfecHeaderSize2KBitsSet,
180 writer.FecHeaderSize(min_packet_mask_size));
181 }
182
183 TEST(FlexfecHeaderReaderWriterTest,
184 ExpandsLongUlpfecPacketMaskWithBits46And47Set) {
185 FlexfecHeaderWriter writer;
186 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
187 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
188 SetBit(46, packet_mask.get());
189 SetBit(47, packet_mask.get());
190 size_t min_packet_mask_size =
191 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
192 EXPECT_EQ(kFlexfecPacketMaskSize2KBitsSet, min_packet_mask_size);
193 EXPECT_EQ(kFlexfecHeaderSize2KBitsSet,
194 writer.FecHeaderSize(min_packet_mask_size));
195 }
196
197 TEST(FlexfecHeaderReaderWriterTest,
198 WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Clear) {
199 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
200 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
201 ClearBit(15, packet_mask.get());
202 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
203 auto read_packet = ReadHeader(*written_packet);
204 VerifyHeaders(kFlexfecHeaderSize0KBitsSet, packet_mask.get(),
205 kFlexfecPacketMaskSize0KBitsSet, *written_packet, *read_packet);
206 }
207
208 TEST(FlexfecHeaderReaderWriterTest,
209 WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Set) {
210 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
211 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
212 SetBit(15, packet_mask.get());
213 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
214 auto read_packet = ReadHeader(*written_packet);
215 VerifyHeaders(kFlexfecHeaderSize1KBitsSet, packet_mask.get(),
216 kFlexfecPacketMaskSize1KBitsSet, *written_packet, *read_packet);
217 }
218
219 TEST(FlexfecHeaderReaderWriterTest,
220 WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Clear) {
221 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
222 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
223 ClearBit(46, packet_mask.get());
224 ClearBit(47, packet_mask.get());
225 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
226 auto read_packet = ReadHeader(*written_packet);
227 VerifyHeaders(kFlexfecHeaderSize1KBitsSet, packet_mask.get(),
228 kFlexfecPacketMaskSize1KBitsSet, *written_packet, *read_packet);
229 }
230
231 TEST(FlexfecHeaderReaderWriterTest,
232 WriteAndReadLargeUlpfecPacketHeaderWithMaskBit46SetBit47Clear) {
233 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
234 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
235 SetBit(46, packet_mask.get());
236 ClearBit(47, packet_mask.get());
237 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
238 auto read_packet = ReadHeader(*written_packet);
239 VerifyHeaders(kFlexfecHeaderSize2KBitsSet, packet_mask.get(),
240 kFlexfecPacketMaskSize2KBitsSet, *written_packet, *read_packet);
241 }
242
243 TEST(FlexfecHeaderReaderWriterTest,
244 WriteAndReadLargeUlpfecPacketHeaderMaskWithBit46ClearBit47Set) {
245 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
246 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
247 ClearBit(46, packet_mask.get());
248 SetBit(47, packet_mask.get());
249 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
250 auto read_packet = ReadHeader(*written_packet);
251 VerifyHeaders(kFlexfecHeaderSize2KBitsSet, packet_mask.get(),
252 kFlexfecPacketMaskSize2KBitsSet, *written_packet, *read_packet);
253 }
254
255 TEST(FlexfecHeaderReaderWriterTest,
256 WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Set) {
257 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
258 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
259 SetBit(46, packet_mask.get());
260 SetBit(47, packet_mask.get());
261 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
262 auto read_packet = ReadHeader(*written_packet);
263 VerifyHeaders(kFlexfecHeaderSize2KBitsSet, packet_mask.get(),
264 kFlexfecPacketMaskSize2KBitsSet, *written_packet, *read_packet);
265 }
266
267 TEST(FlexfecHeaderReaderWriterTest,
268 ReadPacketWithoutStreamSpecificHeaderShouldFail) {
269 FlexfecHeaderReader reader;
270
271 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
272 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
273 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
274
275 // Simulate short received packet.
276 ReceivedFecPacket read_packet;
277 read_packet.ssrc = kFlexfecSsrc;
278 read_packet.pkt = std::move(written_packet);
279 read_packet.pkt->length = 12;
280 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
281 }
282
283 TEST(FlexfecHeaderReaderWriterTest, ReadShortPacketWithKBit0SetShouldFail) {
284 FlexfecHeaderReader reader;
285
286 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
287 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
288 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
289
290 // Simulate short received packet.
291 ReceivedFecPacket read_packet;
292 read_packet.ssrc = kFlexfecSsrc;
293 read_packet.pkt = std::move(written_packet);
294 read_packet.pkt->length = 18;
295 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
296 }
297
298 TEST(FlexfecHeaderReaderWriterTest, ReadShortPacketWithKBit1SetShouldFail) {
299 FlexfecHeaderReader reader;
300
301 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
302 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
303 SetBit(15, packet_mask.get()); // This expands the packet mask "once".
304 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
305
306 // Simulate short received packet.
307 ReceivedFecPacket read_packet;
308 read_packet.ssrc = kFlexfecSsrc;
309 read_packet.pkt = std::move(written_packet);
310 read_packet.pkt->length = 20;
311 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
312 }
313
314 TEST(FlexfecHeaderReaderWriterTest, ReadShortPacketWithKBit2SetShouldFail) {
315 FlexfecHeaderReader reader;
316
317 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
318 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
319 SetBit(47, packet_mask.get()); // This expands the packet mask "twice".
320 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
321
322 // Simulate short received packet.
323 ReceivedFecPacket read_packet;
324 read_packet.ssrc = kFlexfecSsrc;
325 read_packet.pkt = std::move(written_packet);
326 read_packet.pkt->length = 24;
327 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
328 }
329
330 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698