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

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

Issue 2260803002: Generalize FEC header formatting. (pt. 4) (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback response 5. 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/forward_error_correction.h"
23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
24 #include "webrtc/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h"
25
26 namespace webrtc {
27
28 namespace {
29 constexpr uint32_t kMediaSsrc = 1254983;
30 constexpr uint16_t kMediaStartSeqNum = 825;
31 constexpr size_t kMediaPacketLength = 1234;
32
33 constexpr size_t kUlpfecHeaderSizeLBitClear = 14;
34 constexpr size_t kUlpfecHeaderSizeLBitSet = 18;
35 constexpr size_t kUlpfecPacketMaskOffset = 12;
36 } // namespace
37
38 using Packet = ::webrtc::ForwardErrorCorrection::Packet;
39 using PacketList = ::webrtc::ForwardErrorCorrection::PacketList;
40 using ReceivedFecPacket = ::webrtc::ForwardErrorCorrection::ReceivedFecPacket;
41
42 class UlpfecHeaderReaderWriterTest : public ::testing::Test {
43 protected:
44 UlpfecHeaderReaderWriterTest() : random_(0xabcdef123456) {}
45
46 // Randomly generate packet mask of specified size.
47 void GeneratePacketMask(size_t packet_mask_size);
48
49 std::unique_ptr<Packet> WriteHeader(size_t packet_mask_size);
50 std::unique_ptr<ReceivedFecPacket> ReadHeader(const Packet& packet_to_write);
51
52 void VerifyHeaders(size_t expected_fec_header_size,
53 size_t expected_packet_mask_size,
54 const Packet& packet_to_write,
55 const ReceivedFecPacket& packet_to_read);
56
57 UlpfecHeaderReader reader_;
58 UlpfecHeaderWriter writer_;
59
60 Random random_;
61 uint8_t packet_mask_[kUlpfecMaxPacketMaskSize];
62 };
63
64 void UlpfecHeaderReaderWriterTest::GeneratePacketMask(size_t packet_mask_size) {
65 RTC_DCHECK_LE(packet_mask_size, kUlpfecMaxPacketMaskSize);
66 memset(packet_mask_, 0u, sizeof(packet_mask_));
67 for (size_t i = 0; i < packet_mask_size; ++i) {
68 packet_mask_[i] = random_.Rand<uint8_t>();
69 }
70 }
71
72 std::unique_ptr<Packet> UlpfecHeaderReaderWriterTest::WriteHeader(
73 size_t packet_mask_size) {
74 // Write FEC header.
danilchap 2016/08/31 14:38:29 with new helper function names this comment might
brandtr 2016/09/01 11:57:20 Done.
75 std::unique_ptr<Packet> packet_to_write(new Packet());
76 packet_to_write->length = kMediaPacketLength;
77 for (size_t i = 0; i < packet_to_write->length; ++i) {
78 packet_to_write->data[i] = random_.Rand<uint8_t>();
79 }
80 constexpr uint16_t kSeqNumBase = kMediaStartSeqNum;
81 writer_.FinalizeFecHeader(kSeqNumBase, packet_mask_, packet_mask_size,
82 packet_to_write.get());
83 return packet_to_write;
84 }
85
86 std::unique_ptr<ReceivedFecPacket> UlpfecHeaderReaderWriterTest::ReadHeader(
87 const Packet& packet_to_write) {
88 // Read FEC header.
89 std::unique_ptr<ReceivedFecPacket> packet_to_read(new ReceivedFecPacket());
90 packet_to_read->ssrc = kMediaSsrc;
91 packet_to_read->protected_ssrc = kMediaSsrc;
92 packet_to_read->pkt = rtc::scoped_refptr<Packet>(new Packet());
93 memcpy(packet_to_read->pkt->data, packet_to_write.data,
94 packet_to_write.length);
95 packet_to_read->pkt->length = packet_to_write.length;
96 EXPECT_TRUE(reader_.ReadFecHeader(packet_to_read.get()));
97 return packet_to_read;
98 }
99
100 void UlpfecHeaderReaderWriterTest::VerifyHeaders(
101 size_t expected_fec_header_size,
102 size_t expected_packet_mask_size,
103 const Packet& packet_to_write,
104 const ReceivedFecPacket& packet_to_read) {
105 // Verify that written and read FEC headers are consistent.
106 EXPECT_EQ(expected_fec_header_size, packet_to_read.fec_header_size);
107 EXPECT_EQ(packet_to_write.length - expected_fec_header_size,
108 packet_to_read.protection_length);
109 ReceivedFecPacket::StreamPacketMaskInfo stream_packet_mask_info =
110 packet_to_read.packet_mask_infos.at(kMediaSsrc);
111 EXPECT_EQ(kMediaStartSeqNum, stream_packet_mask_info.seq_num_base);
112 size_t packet_mask_offset = stream_packet_mask_info.offset;
113 EXPECT_EQ(kUlpfecPacketMaskOffset, packet_mask_offset);
114 size_t size = stream_packet_mask_info.size;
115 ASSERT_EQ(expected_packet_mask_size, size);
116 EXPECT_EQ(0, memcmp(packet_mask_,
117 &packet_to_read.pkt->data[packet_mask_offset], size));
118 // Verify that the call to ReadFecHeader did not tamper with the payload.
119 EXPECT_EQ(0, memcmp(&packet_to_write.data[expected_fec_header_size],
120 &packet_to_read.pkt->data[expected_fec_header_size],
121 packet_to_write.length - expected_fec_header_size));
122 }
123
124 TEST_F(UlpfecHeaderReaderWriterTest, CalculateSmallHeaderSize) {
125 GeneratePacketMask(kUlpfecPacketMaskSizeLBitClear);
126 EXPECT_EQ(kUlpfecHeaderSizeLBitClear,
127 writer_.FecHeaderSize(writer_.MinPacketMaskSize(
128 packet_mask_, kUlpfecPacketMaskSizeLBitClear)));
129 }
130
131 TEST_F(UlpfecHeaderReaderWriterTest, CalculateLargeHeaderSize) {
132 GeneratePacketMask(kUlpfecPacketMaskSizeLBitSet);
133 EXPECT_EQ(kUlpfecHeaderSizeLBitSet,
134 writer_.FecHeaderSize(writer_.MinPacketMaskSize(
135 packet_mask_, kUlpfecPacketMaskSizeLBitSet)));
136 }
137
138 TEST_F(UlpfecHeaderReaderWriterTest, WriteAndReadSmallHeader) {
139 GeneratePacketMask(kUlpfecPacketMaskSizeLBitClear);
140 auto packet_to_write = WriteHeader(kUlpfecPacketMaskSizeLBitClear);
141 auto packet_to_read = ReadHeader(*packet_to_write);
142 VerifyHeaders(kUlpfecHeaderSizeLBitClear, kUlpfecPacketMaskSizeLBitClear,
143 *packet_to_write, *packet_to_read);
144 }
145
146 TEST_F(UlpfecHeaderReaderWriterTest, WriteAndReadLargeHeader) {
147 GeneratePacketMask(kUlpfecPacketMaskSizeLBitSet);
148 auto packet_to_write = WriteHeader(kUlpfecPacketMaskSizeLBitSet);
149 auto packet_to_read = ReadHeader(*packet_to_write);
150 VerifyHeaders(kUlpfecHeaderSizeLBitSet, kUlpfecPacketMaskSizeLBitSet,
151 *packet_to_write, *packet_to_read);
152 }
153
154 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698