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

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: Move tests so all FlexfecReaderTests are in line. 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 kFlexfecHeaderSizeKBit0Set = 20;
40 constexpr size_t kFlexfecHeaderSizeKBit1Set = 24;
41 constexpr size_t kFlexfecHeaderSizeKBit2Set = 32;
42 constexpr size_t kFlexfecPacketMaskOffset = 18;
43 constexpr size_t kFlexfecPacketMaskSizeKBit0Set = 2;
44 constexpr size_t kFlexfecPacketMaskSizeKBit1Set = 6;
45 constexpr size_t kFlexfecPacketMaskSizeKBit2Set = 14;
46 constexpr size_t kFlexfecMaxPacketSize = kFlexfecPacketMaskSizeKBit2Set;
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(FlexfecHeaderReaderTest, CorrectlyReadsHeaderWithKBit0Set) {
danilchap 2016/09/14 13:12:09 'Correctly' is implicit for tests (at least should
brandtr 2016/09/20 11:13:33 Changed.
117 const uint8_t packet[] = {
118 0x00, 0x00, 0xab, 0xcd, // F, R bits clear, "random" length recovery
danilchap 2016/09/14 13:12:09 remove 'random', it is misleading
brandtr 2016/09/20 11:13:33 Done.
119 0x01, 0x23, 0x45, 0x67, // "random" TS recovery
danilchap 2016/09/14 13:12:09 what is TS?
brandtr 2016/09/20 11:13:32 TimeStamp. This follows the nomenclature in the In
120 0x01, 0x00, 0x00, 0x00, // SSRCCount = 1. Reserved bits are zero.
danilchap 2016/09/14 13:12:09 may be constexpr size_t kSsrcCount = 1; constexpr
brandtr 2016/09/20 11:13:32 Done.
121 0x11, 0x22, 0x33, 0x44, // "random" SSRC
122 0xaa, 0xbb, 0x88, 0x81, // "random" SN base, K-bit 0 set, "random" mask
danilchap 2016/09/14 13:12:09 Having 3 comments describing different bytes doesn
brandtr 2016/09/20 11:13:33 Changed, now I align the different packet masks wi
123 0x00, 0x00, 0x00, 0x00 // payload
danilchap 2016/09/14 13:12:09 try to start comments with Uppercase and finish wi
brandtr 2016/09/20 11:13:33 Done.
124 };
125 const size_t packet_length = sizeof(packet);
126 ReceivedFecPacket read_packet;
127 read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
128 memcpy(read_packet.pkt->data, packet, packet_length);
129 read_packet.pkt->length = packet_length;
130 FlexfecHeaderReader reader;
131 EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
danilchap 2016/09/14 13:12:09 add an empty line above to split preparation and e
brandtr 2016/09/20 11:13:33 Done.
132
133 EXPECT_EQ(20U, read_packet.fec_header_size);
134 EXPECT_EQ(
135 static_cast<uint32_t>((0x11 << 24) + (0x22 << 16) + (0x33 << 8) + 0x44),
danilchap 2016/09/14 13:12:09 use 0x11223344 or better define a constant above k
brandtr 2016/09/20 11:13:33 Done.
136 read_packet.protected_ssrc);
137 EXPECT_EQ((0xaa << 8) + 0xbb, read_packet.seq_num_base);
138 const size_t packet_mask_offset = read_packet.packet_mask_offset;
139 EXPECT_EQ(18U, packet_mask_offset);
140 const size_t packet_mask_size = read_packet.packet_mask_size;
141 EXPECT_EQ(2U, packet_mask_size);
142 EXPECT_EQ(packet_length - 20, read_packet.protection_length);
danilchap 2016/09/14 13:12:09 what is 20?
brandtr 2016/09/20 11:13:33 It's the FEC header size. This has been clarified,
143 // Ensure that the K-bits are removed and the packet mask has been packed.
144 const uint8_t ulpfec_packet_mask[] = {0x11, 0x02};
danilchap 2016/09/14 13:12:09 name it as a constant, not a variable and move to
brandtr 2016/09/20 11:13:32 Done.
145 EXPECT_EQ(
146 0, memcmp(ulpfec_packet_mask, read_packet.pkt->data + packet_mask_offset,
147 packet_mask_size));
148 }
149
150 TEST(FlexfecHeaderReaderTest, CorrectlyReadsHeaderWithKBit1Set) {
151 const uint8_t packet[] = {
152 0x00, 0x00, 0xab, 0xcd, // F, R bits clear, "random" length recovery
153 0x01, 0x23, 0x45, 0x67, // "random" TS recovery
154 0x01, 0x00, 0x00, 0x00, // SSRCCount = 1. Reserved bits are zero.
155 0x44, 0x33, 0x22, 0x11, // "random" SSRC
156 0xbb, 0xcc, 0x48, 0x81, // "random" SN base, K-bit 0 clear, "random" mask
157 0x82, 0x11, 0x00, 0x21, // K-bit 1 set
158 0x00, 0x00, 0x00, 0x00 // payload
159 };
160 const size_t packet_length = sizeof(packet);
161 ReceivedFecPacket read_packet;
162 read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
163 memcpy(read_packet.pkt->data, packet, packet_length);
164 read_packet.pkt->length = packet_length;
165 FlexfecHeaderReader reader;
166 EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
167
168 EXPECT_EQ(24U, read_packet.fec_header_size);
169 EXPECT_EQ(
170 static_cast<uint32_t>((0x44 << 24) + (0x33 << 16) + (0x22 << 8) + 0x11),
171 read_packet.protected_ssrc);
172 EXPECT_EQ((0xbb << 8) + 0xcc, read_packet.seq_num_base);
173 const size_t packet_mask_offset = read_packet.packet_mask_offset;
174 EXPECT_EQ(18U, packet_mask_offset);
175 const size_t packet_mask_size = read_packet.packet_mask_size;
176 EXPECT_EQ(6U, packet_mask_size);
177 EXPECT_EQ(packet_length - 24, read_packet.protection_length);
178 // Ensure that the K-bits are removed and the packet mask has been packed.
179 const uint8_t ulpfec_packet_mask[] = {0x91, 0x02, 0x08, 0x44, 0x00, 0x84};
180 EXPECT_EQ(
181 0, memcmp(ulpfec_packet_mask, read_packet.pkt->data + packet_mask_offset,
182 packet_mask_size));
183 }
184
185 TEST(FlexfecHeaderReaderTest, CorrectlyReadsHeaderWithKBit2Set) {
186 //
187 const uint8_t packet[] = {
188 0x00, 0x00, 0xab, 0xcd, // F, R bits clear, "random" length recovery
189 0x01, 0x23, 0x45, 0x67, // "random" TS recovery
190 0x01, 0x00, 0x00, 0x00, // SSRCCount = 1. Reserved bits are zero.
191 0x4a, 0x3b, 0x2c, 0x1d, // "random" SSRC
192 0xbd, 0xdb, 0x48, 0x81, // "random" SN base, K-bit 0 clear, "random" mask
193 0x02, 0x11, 0x00, 0x21, // K-bit 1 clear
194 0x81, 0x11, 0x11, 0x11, // K-bit 2 set
195 0x11, 0x11, 0x11, 0x11, //
196 0x00, 0x00, 0x00, 0x00 // payload
197 };
198 const size_t packet_length = sizeof(packet);
199 ReceivedFecPacket read_packet;
200 read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
201 memcpy(read_packet.pkt->data, packet, packet_length);
202 read_packet.pkt->length = packet_length;
203 FlexfecHeaderReader reader;
204 EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
205
206 EXPECT_EQ(32U, read_packet.fec_header_size);
207 EXPECT_EQ(
208 static_cast<uint32_t>((0x4a << 24) + (0x3b << 16) + (0x2c << 8) + 0x1d),
209 read_packet.protected_ssrc);
210 EXPECT_EQ((0xbd << 8) + 0xdb, read_packet.seq_num_base);
211 const size_t packet_mask_offset = read_packet.packet_mask_offset;
212 EXPECT_EQ(18U, packet_mask_offset);
213 const size_t packet_mask_size = read_packet.packet_mask_size;
214 EXPECT_EQ(14U, packet_mask_size);
215 EXPECT_EQ(packet_length - 32, read_packet.protection_length);
216 // Ensure that the K-bits are removed and the packet mask has been packed.
217 const uint8_t ulpfec_packet_mask[] = {0x91, 0x02, 0x08, 0x44, 0x00,
218 0x84, 0x08, 0x88, 0x88, 0x88,
219 0x88, 0x88, 0x88, 0x88};
220 EXPECT_EQ(
221 0, memcmp(ulpfec_packet_mask, read_packet.pkt->data + packet_mask_offset,
222 packet_mask_size));
223 }
224
225 TEST(FlexfecHeaderReaderTest, ReadPacketWithoutStreamSpecificHeaderShouldFail) {
226 FlexfecHeaderReader reader;
227
228 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
229 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
230 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
231
232 // Simulate short received packet.
233 ReceivedFecPacket read_packet;
234 read_packet.ssrc = kFlexfecSsrc;
235 read_packet.pkt = std::move(written_packet);
236 read_packet.pkt->length = 12;
237 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
238 }
239
240 TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit0SetShouldFail) {
241 FlexfecHeaderReader reader;
242
243 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
244 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
245 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
246
247 // Simulate short received packet.
248 ReceivedFecPacket read_packet;
249 read_packet.ssrc = kFlexfecSsrc;
250 read_packet.pkt = std::move(written_packet);
251 read_packet.pkt->length = 18;
252 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
253 }
254
255 TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit1SetShouldFail) {
256 FlexfecHeaderReader reader;
257
258 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
259 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
260 SetBit(15, packet_mask.get()); // This expands the packet mask "once".
261 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
262
263 // Simulate short received packet.
264 ReceivedFecPacket read_packet;
265 read_packet.ssrc = kFlexfecSsrc;
266 read_packet.pkt = std::move(written_packet);
267 read_packet.pkt->length = 20;
268 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
269 }
270
271 TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit2SetShouldFail) {
272 FlexfecHeaderReader reader;
273
274 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
275 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
276 SetBit(47, packet_mask.get()); // This expands the packet mask "twice".
277 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
278
279 // Simulate short received packet.
280 ReceivedFecPacket read_packet;
281 read_packet.ssrc = kFlexfecSsrc;
282 read_packet.pkt = std::move(written_packet);
283 read_packet.pkt->length = 24;
284 EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
285 }
286
287 TEST(FlexfecHeaderWriterTest, CorrectlyFinalizesHeaderWithKBit0Set) {
288 const uint8_t ulpfec_packet_mask[] = {0x11, 0x02};
289 Packet written_packet;
290 written_packet.length = kMediaPacketLength;
291 for (size_t i = 0; i < written_packet.length; ++i) {
292 written_packet.data[i] = i;
293 }
294 FlexfecHeaderWriter writer;
295 writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, ulpfec_packet_mask,
296 sizeof(ulpfec_packet_mask), &written_packet);
297
298 const uint8_t* packet = written_packet.data;
299 EXPECT_EQ(0x00, packet[0] & 0xc0); // F and R bits clear.
300 EXPECT_EQ(0x01, packet[8]); // SSRCCount = 1
301 EXPECT_EQ(kMediaSsrc,
302 static_cast<uint32_t>((packet[12] << 24) + (packet[13] << 16) +
danilchap 2016/09/14 13:12:09 may be EXPECT_EQ(kMediaSsrc, ByteReader<uint32_t>
brandtr 2016/09/20 11:13:33 Done.
303 (packet[14] << 8) + packet[15]));
304 EXPECT_EQ(kMediaStartSeqNum,
305 static_cast<uint16_t>((packet[16] << 8) + packet[17]));
306 const uint8_t flexfec_packet_mask[] = {0x88, 0x81};
307 EXPECT_EQ(
308 0, memcmp(flexfec_packet_mask, packet + 18, sizeof(flexfec_packet_mask)));
danilchap 2016/09/14 13:12:09 might be better to split into 2 expectations: EXPE
brandtr 2016/09/20 11:13:33 Done. Thanks for writing out the gmock code for m
309 }
310
311 TEST(FlexfecHeaderWriterTest, CorrectlyFinalizesHeaderWithKBit1Set) {
312 const uint8_t ulpfec_packet_mask[] = {0x91, 0x02, 0x08, 0x44, 0x00, 0x84};
313 Packet written_packet;
314 written_packet.length = kMediaPacketLength;
315 for (size_t i = 0; i < written_packet.length; ++i) {
316 written_packet.data[i] = i;
317 }
318 FlexfecHeaderWriter writer;
319 writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, ulpfec_packet_mask,
320 sizeof(ulpfec_packet_mask), &written_packet);
321
322 const uint8_t* packet = written_packet.data;
323 EXPECT_EQ(0x00, packet[0] & 0xc0); // F and R bits clear.
danilchap 2016/09/14 13:12:09 may be test seperatly: constexpr uint8_t kFbit = 1
brandtr 2016/09/20 11:13:32 Done.
324 EXPECT_EQ(0x01, packet[8]); // SSRCCount = 1
325 EXPECT_EQ(kMediaSsrc,
326 static_cast<uint32_t>((packet[12] << 24) + (packet[13] << 16) +
327 (packet[14] << 8) + packet[15]));
328 EXPECT_EQ(kMediaStartSeqNum,
329 static_cast<uint16_t>((packet[16] << 8) + packet[17]));
330 const uint8_t flexfec_packet_mask[] = {0x48, 0x81, 0x82, 0x11, 0x00, 0x21};
331 EXPECT_EQ(
332 0, memcmp(flexfec_packet_mask, packet + 18, sizeof(flexfec_packet_mask)));
333 }
334
335 TEST(FlexfecHeaderWriterTest, CorrectlyFinalizesHeaderWithKBit2Set) {
336 const uint8_t ulpfec_packet_mask[] = {0x22, 0x22, 0x44, 0x44, 0x44, 0x41};
337 Packet written_packet;
338 written_packet.length = kMediaPacketLength;
339 for (size_t i = 0; i < written_packet.length; ++i) {
340 written_packet.data[i] = i;
341 }
342 FlexfecHeaderWriter writer;
343 writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, ulpfec_packet_mask,
344 sizeof(ulpfec_packet_mask), &written_packet);
345
346 const uint8_t* packet = written_packet.data;
347 EXPECT_EQ(0x00, packet[0] & 0xc0); // F and R bits clear.
348 EXPECT_EQ(0x01, packet[8]); // SSRCCount = 1
349 EXPECT_EQ(kMediaSsrc,
350 static_cast<uint32_t>((packet[12] << 24) + (packet[13] << 16) +
351 (packet[14] << 8) + packet[15]));
352 EXPECT_EQ(kMediaStartSeqNum,
353 static_cast<uint16_t>((packet[16] << 8) + packet[17]));
354 const uint8_t flexfec_packet_mask[] = {
355 0x11, 0x11, // K-bit 0 clear.
356 0x11, 0x11, 0x11, 0x10, // K-bit 1 clear.
357 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // K-bit 2 set.
358 };
359 EXPECT_EQ(
360 0, memcmp(flexfec_packet_mask, packet + 18, sizeof(flexfec_packet_mask)));
361 }
362
363 TEST(FlexfecHeaderWriterTest, ContractsShortUlpfecPacketMaskWithBit15Clear) {
364 FlexfecHeaderWriter writer;
365 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
366 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
367 ClearBit(15, packet_mask.get());
368 size_t min_packet_mask_size =
369 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
370 EXPECT_EQ(kFlexfecPacketMaskSizeKBit0Set, min_packet_mask_size);
371 EXPECT_EQ(kFlexfecHeaderSizeKBit0Set,
372 writer.FecHeaderSize(min_packet_mask_size));
373 }
374
375 TEST(FlexfecHeaderWriterTest, ExpandsShortUlpfecPacketMaskWithBit15Set) {
376 FlexfecHeaderWriter writer;
377 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
378 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
379 SetBit(15, packet_mask.get());
380 size_t min_packet_mask_size =
381 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
382 EXPECT_EQ(kFlexfecPacketMaskSizeKBit1Set, min_packet_mask_size);
383 EXPECT_EQ(kFlexfecHeaderSizeKBit1Set,
384 writer.FecHeaderSize(min_packet_mask_size));
385 }
386
387 TEST(FlexfecHeaderWriterTest,
388 ContractsLongUlpfecPacketMaskWithBits46And47Clear) {
389 FlexfecHeaderWriter writer;
390 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
391 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
392 ClearBit(46, packet_mask.get());
393 ClearBit(47, packet_mask.get());
394 size_t min_packet_mask_size =
395 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
396 EXPECT_EQ(kFlexfecPacketMaskSizeKBit1Set, min_packet_mask_size);
397 EXPECT_EQ(kFlexfecHeaderSizeKBit1Set,
398 writer.FecHeaderSize(min_packet_mask_size));
399 }
400
401 TEST(FlexfecHeaderWriterTest, ExpandsLongUlpfecPacketMaskWithBits46And47Clear) {
402 FlexfecHeaderWriter writer;
403 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
404 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
405 SetBit(46, packet_mask.get());
406 ClearBit(47, packet_mask.get());
407 size_t min_packet_mask_size =
408 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
409 EXPECT_EQ(kFlexfecPacketMaskSizeKBit2Set, min_packet_mask_size);
410 EXPECT_EQ(kFlexfecHeaderSizeKBit2Set,
411 writer.FecHeaderSize(min_packet_mask_size));
412 }
413
414 TEST(FlexfecHeaderWriterTest,
415 ExpandsLongUlpfecPacketMaskWithBit46ClearBit47Set) {
416 FlexfecHeaderWriter writer;
417 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
418 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
419 ClearBit(46, packet_mask.get());
420 SetBit(47, packet_mask.get());
421 size_t min_packet_mask_size =
422 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
423 EXPECT_EQ(kFlexfecPacketMaskSizeKBit2Set, min_packet_mask_size);
424 EXPECT_EQ(kFlexfecHeaderSizeKBit2Set,
425 writer.FecHeaderSize(min_packet_mask_size));
426 }
427
428 TEST(FlexfecHeaderWriterTest, ExpandsLongUlpfecPacketMaskWithBits46And47Set) {
429 FlexfecHeaderWriter writer;
430 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
431 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
432 SetBit(46, packet_mask.get());
433 SetBit(47, packet_mask.get());
434 size_t min_packet_mask_size =
435 writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
436 EXPECT_EQ(kFlexfecPacketMaskSizeKBit2Set, min_packet_mask_size);
437 EXPECT_EQ(kFlexfecHeaderSizeKBit2Set,
438 writer.FecHeaderSize(min_packet_mask_size));
439 }
440
441 TEST(FlexfecHeaderReaderWriterTest,
442 WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Clear) {
443 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
444 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
445 ClearBit(15, packet_mask.get());
446 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
447 auto read_packet = ReadHeader(*written_packet);
448 VerifyHeaders(kFlexfecHeaderSizeKBit0Set, packet_mask.get(),
449 kFlexfecPacketMaskSizeKBit0Set, *written_packet, *read_packet);
450 }
451
452 TEST(FlexfecHeaderReaderWriterTest,
453 WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Set) {
454 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
455 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
456 SetBit(15, packet_mask.get());
457 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
458 auto read_packet = ReadHeader(*written_packet);
459 VerifyHeaders(kFlexfecHeaderSizeKBit1Set, packet_mask.get(),
460 kFlexfecPacketMaskSizeKBit1Set, *written_packet, *read_packet);
461 }
462
463 TEST(FlexfecHeaderReaderWriterTest,
464 WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Clear) {
465 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
466 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
467 ClearBit(46, packet_mask.get());
468 ClearBit(47, packet_mask.get());
469 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
470 auto read_packet = ReadHeader(*written_packet);
471 VerifyHeaders(kFlexfecHeaderSizeKBit1Set, packet_mask.get(),
472 kFlexfecPacketMaskSizeKBit1Set, *written_packet, *read_packet);
473 }
474
475 TEST(FlexfecHeaderReaderWriterTest,
476 WriteAndReadLargeUlpfecPacketHeaderWithMaskBit46SetBit47Clear) {
477 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
478 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
479 SetBit(46, packet_mask.get());
480 ClearBit(47, packet_mask.get());
481 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
482 auto read_packet = ReadHeader(*written_packet);
483 VerifyHeaders(kFlexfecHeaderSizeKBit2Set, packet_mask.get(),
484 kFlexfecPacketMaskSizeKBit2Set, *written_packet, *read_packet);
485 }
486
487 TEST(FlexfecHeaderReaderWriterTest,
488 WriteAndReadLargeUlpfecPacketHeaderMaskWithBit46ClearBit47Set) {
489 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
490 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
491 ClearBit(46, packet_mask.get());
492 SetBit(47, packet_mask.get());
493 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
494 auto read_packet = ReadHeader(*written_packet);
495 VerifyHeaders(kFlexfecHeaderSizeKBit2Set, packet_mask.get(),
496 kFlexfecPacketMaskSizeKBit2Set, *written_packet, *read_packet);
497 }
498
499 TEST(FlexfecHeaderReaderWriterTest,
500 WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Set) {
501 const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
502 auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
503 SetBit(46, packet_mask.get());
504 SetBit(47, packet_mask.get());
505 auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
506 auto read_packet = ReadHeader(*written_packet);
507 VerifyHeaders(kFlexfecHeaderSizeKBit2Set, packet_mask.get(),
508 kFlexfecPacketMaskSizeKBit2Set, *written_packet, *read_packet);
509 }
510
511 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698