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

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

Issue 2451643002: Rename FecReceiver to UlpfecReceiver. (Closed)
Patch Set: Fix GYP. Created 4 years, 1 month 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
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <string.h> 11 #include <string.h>
12 12
13 #include <list> 13 #include <list>
14 #include <memory> 14 #include <memory>
15 15
16 #include "webrtc/modules/rtp_rtcp/include/fec_receiver.h"
17 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 16 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
17 #include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h"
18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" 18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
19 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 19 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
20 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" 20 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
21 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" 21 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
22 #include "webrtc/test/gmock.h" 22 #include "webrtc/test/gmock.h"
23 #include "webrtc/test/gtest.h" 23 #include "webrtc/test/gtest.h"
24 24
25 namespace webrtc { 25 namespace webrtc {
26 26
27 namespace { 27 namespace {
28 using ::testing::_; 28 using ::testing::_;
29 using ::testing::Args; 29 using ::testing::Args;
30 using ::testing::ElementsAreArray; 30 using ::testing::ElementsAreArray;
31 using ::testing::Return; 31 using ::testing::Return;
32 32
33 using test::fec::AugmentedPacket; 33 using test::fec::AugmentedPacket;
34 using Packet = ForwardErrorCorrection::Packet; 34 using Packet = ForwardErrorCorrection::Packet;
35 using test::fec::UlpfecPacketGenerator; 35 using test::fec::UlpfecPacketGenerator;
36 36
37 constexpr int kFecPayloadType = 96; 37 constexpr int kFecPayloadType = 96;
38 constexpr uint32_t kMediaSsrc = 835424; 38 constexpr uint32_t kMediaSsrc = 835424;
39 } // namespace 39 } // namespace
40 40
41 class ReceiverFecTest : public ::testing::Test { 41 class UlpfecReceiverTest : public ::testing::Test {
42 protected: 42 protected:
43 ReceiverFecTest() 43 UlpfecReceiverTest()
44 : fec_(ForwardErrorCorrection::CreateUlpfec()), 44 : fec_(ForwardErrorCorrection::CreateUlpfec()),
45 receiver_fec_(FecReceiver::Create(&rtp_data_callback_)), 45 receiver_fec_(UlpfecReceiver::Create(&rtp_data_callback_)),
46 packet_generator_(kMediaSsrc) {} 46 packet_generator_(kMediaSsrc) {}
47 47
48 // Generates |num_fec_packets| FEC packets, given |media_packets|. 48 // Generates |num_fec_packets| FEC packets, given |media_packets|.
49 void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets, 49 void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets,
50 size_t num_fec_packets, 50 size_t num_fec_packets,
51 std::list<ForwardErrorCorrection::Packet*>* fec_packets); 51 std::list<ForwardErrorCorrection::Packet*>* fec_packets);
52 52
53 // Generates |num_media_packets| corresponding to a single frame. 53 // Generates |num_media_packets| corresponding to a single frame.
54 void PacketizeFrame(size_t num_media_packets, 54 void PacketizeFrame(size_t num_media_packets,
55 size_t frame_offset, 55 size_t frame_offset,
(...skipping 14 matching lines...) Expand all
70 size_t times); 70 size_t times);
71 71
72 void InjectGarbagePacketLength(size_t fec_garbage_offset); 72 void InjectGarbagePacketLength(size_t fec_garbage_offset);
73 73
74 static void SurvivesMaliciousPacket(const uint8_t* data, 74 static void SurvivesMaliciousPacket(const uint8_t* data,
75 size_t length, 75 size_t length,
76 uint8_t ulpfec_payload_type); 76 uint8_t ulpfec_payload_type);
77 77
78 MockRtpData rtp_data_callback_; 78 MockRtpData rtp_data_callback_;
79 std::unique_ptr<ForwardErrorCorrection> fec_; 79 std::unique_ptr<ForwardErrorCorrection> fec_;
80 std::unique_ptr<FecReceiver> receiver_fec_; 80 std::unique_ptr<UlpfecReceiver> receiver_fec_;
81 UlpfecPacketGenerator packet_generator_; 81 UlpfecPacketGenerator packet_generator_;
82 }; 82 };
83 83
84 void ReceiverFecTest::EncodeFec( 84 void UlpfecReceiverTest::EncodeFec(
85 const ForwardErrorCorrection::PacketList& media_packets, 85 const ForwardErrorCorrection::PacketList& media_packets,
86 size_t num_fec_packets, 86 size_t num_fec_packets,
87 std::list<ForwardErrorCorrection::Packet*>* fec_packets) { 87 std::list<ForwardErrorCorrection::Packet*>* fec_packets) {
88 const uint8_t protection_factor = 88 const uint8_t protection_factor =
89 num_fec_packets * 255 / media_packets.size(); 89 num_fec_packets * 255 / media_packets.size();
90 // Unequal protection is turned off, and the number of important 90 // Unequal protection is turned off, and the number of important
91 // packets is thus irrelevant. 91 // packets is thus irrelevant.
92 constexpr int kNumImportantPackets = 0; 92 constexpr int kNumImportantPackets = 0;
93 constexpr bool kUseUnequalProtection = false; 93 constexpr bool kUseUnequalProtection = false;
94 constexpr FecMaskType kFecMaskType = kFecMaskBursty; 94 constexpr FecMaskType kFecMaskType = kFecMaskBursty;
95 EXPECT_EQ( 95 EXPECT_EQ(
96 0, fec_->EncodeFec(media_packets, protection_factor, kNumImportantPackets, 96 0, fec_->EncodeFec(media_packets, protection_factor, kNumImportantPackets,
97 kUseUnequalProtection, kFecMaskType, fec_packets)); 97 kUseUnequalProtection, kFecMaskType, fec_packets));
98 ASSERT_EQ(num_fec_packets, fec_packets->size()); 98 ASSERT_EQ(num_fec_packets, fec_packets->size());
99 } 99 }
100 100
101 void ReceiverFecTest::PacketizeFrame( 101 void UlpfecReceiverTest::PacketizeFrame(
102 size_t num_media_packets, 102 size_t num_media_packets,
103 size_t frame_offset, 103 size_t frame_offset,
104 std::list<AugmentedPacket*>* augmented_packets, 104 std::list<AugmentedPacket*>* augmented_packets,
105 ForwardErrorCorrection::PacketList* packets) { 105 ForwardErrorCorrection::PacketList* packets) {
106 packet_generator_.NewFrame(num_media_packets); 106 packet_generator_.NewFrame(num_media_packets);
107 for (size_t i = 0; i < num_media_packets; ++i) { 107 for (size_t i = 0; i < num_media_packets; ++i) {
108 std::unique_ptr<AugmentedPacket> next_packet( 108 std::unique_ptr<AugmentedPacket> next_packet(
109 packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10)); 109 packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10));
110 augmented_packets->push_back(next_packet.get()); 110 augmented_packets->push_back(next_packet.get());
111 packets->push_back(std::move(next_packet)); 111 packets->push_back(std::move(next_packet));
112 } 112 }
113 } 113 }
114 114
115 void ReceiverFecTest::BuildAndAddRedMediaPacket(AugmentedPacket* packet) { 115 void UlpfecReceiverTest::BuildAndAddRedMediaPacket(AugmentedPacket* packet) {
116 std::unique_ptr<AugmentedPacket> red_packet( 116 std::unique_ptr<AugmentedPacket> red_packet(
117 packet_generator_.BuildMediaRedPacket(*packet)); 117 packet_generator_.BuildMediaRedPacket(*packet));
118 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 118 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
119 red_packet->header.header, red_packet->data, 119 red_packet->header.header, red_packet->data,
120 red_packet->length, kFecPayloadType)); 120 red_packet->length, kFecPayloadType));
121 } 121 }
122 122
123 void ReceiverFecTest::BuildAndAddRedFecPacket(Packet* packet) { 123 void UlpfecReceiverTest::BuildAndAddRedFecPacket(Packet* packet) {
124 std::unique_ptr<AugmentedPacket> red_packet( 124 std::unique_ptr<AugmentedPacket> red_packet(
125 packet_generator_.BuildUlpfecRedPacket(*packet)); 125 packet_generator_.BuildUlpfecRedPacket(*packet));
126 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 126 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
127 red_packet->header.header, red_packet->data, 127 red_packet->header.header, red_packet->data,
128 red_packet->length, kFecPayloadType)); 128 red_packet->length, kFecPayloadType));
129 } 129 }
130 130
131 void ReceiverFecTest::VerifyReconstructedMediaPacket( 131 void UlpfecReceiverTest::VerifyReconstructedMediaPacket(
132 const AugmentedPacket& packet, 132 const AugmentedPacket& packet,
133 size_t times) { 133 size_t times) {
134 // Verify that the content of the reconstructed packet is equal to the 134 // Verify that the content of the reconstructed packet is equal to the
135 // content of |packet|, and that the same content is received |times| number 135 // content of |packet|, and that the same content is received |times| number
136 // of times in a row. 136 // of times in a row.
137 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet.length)) 137 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet.length))
138 .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length))) 138 .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length)))
139 .Times(times) 139 .Times(times)
140 .WillRepeatedly(Return(true)); 140 .WillRepeatedly(Return(true));
141 } 141 }
142 142
143 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { 143 void UlpfecReceiverTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
144 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 144 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
145 .WillRepeatedly(Return(true)); 145 .WillRepeatedly(Return(true));
146 146
147 const size_t kNumFecPackets = 1; 147 const size_t kNumFecPackets = 1;
148 std::list<AugmentedPacket*> augmented_media_packets; 148 std::list<AugmentedPacket*> augmented_media_packets;
149 ForwardErrorCorrection::PacketList media_packets; 149 ForwardErrorCorrection::PacketList media_packets;
150 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); 150 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
151 std::list<ForwardErrorCorrection::Packet*> fec_packets; 151 std::list<ForwardErrorCorrection::Packet*> fec_packets;
152 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 152 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
153 ByteWriter<uint16_t>::WriteBigEndian( 153 ByteWriter<uint16_t>::WriteBigEndian(
154 &fec_packets.front()->data[fec_garbage_offset], 0x4711); 154 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
155 155
156 // Inject first media packet, then first FEC packet, skipping the second media 156 // Inject first media packet, then first FEC packet, skipping the second media
157 // packet to cause a recovery from the FEC packet. 157 // packet to cause a recovery from the FEC packet.
158 BuildAndAddRedMediaPacket(augmented_media_packets.front()); 158 BuildAndAddRedMediaPacket(augmented_media_packets.front());
159 BuildAndAddRedFecPacket(fec_packets.front()); 159 BuildAndAddRedFecPacket(fec_packets.front());
160 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 160 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
161 161
162 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 162 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
163 EXPECT_EQ(2U, counter.num_packets); 163 EXPECT_EQ(2U, counter.num_packets);
164 EXPECT_EQ(1U, counter.num_fec_packets); 164 EXPECT_EQ(1U, counter.num_fec_packets);
165 EXPECT_EQ(0U, counter.num_recovered_packets); 165 EXPECT_EQ(0U, counter.num_recovered_packets);
166 } 166 }
167 167
168 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, 168 void UlpfecReceiverTest::SurvivesMaliciousPacket(const uint8_t* data,
169 size_t length, 169 size_t length,
170 uint8_t ulpfec_payload_type) { 170 uint8_t ulpfec_payload_type) {
171 webrtc::RTPHeader header; 171 RTPHeader header;
172 std::unique_ptr<webrtc::RtpHeaderParser> parser( 172 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
173 webrtc::RtpHeaderParser::Create());
174 ASSERT_TRUE(parser->Parse(data, length, &header)); 173 ASSERT_TRUE(parser->Parse(data, length, &header));
175 174
176 webrtc::NullRtpData null_callback; 175 NullRtpData null_callback;
177 std::unique_ptr<webrtc::FecReceiver> receiver_fec( 176 std::unique_ptr<UlpfecReceiver> receiver_fec(
178 webrtc::FecReceiver::Create(&null_callback)); 177 UlpfecReceiver::Create(&null_callback));
179 178
180 receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type); 179 receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type);
181 } 180 }
182 181
183 TEST_F(ReceiverFecTest, TwoMediaOneFec) { 182 TEST_F(UlpfecReceiverTest, TwoMediaOneFec) {
184 constexpr size_t kNumFecPackets = 1u; 183 constexpr size_t kNumFecPackets = 1u;
185 std::list<AugmentedPacket*> augmented_media_packets; 184 std::list<AugmentedPacket*> augmented_media_packets;
186 ForwardErrorCorrection::PacketList media_packets; 185 ForwardErrorCorrection::PacketList media_packets;
187 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); 186 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
188 std::list<ForwardErrorCorrection::Packet*> fec_packets; 187 std::list<ForwardErrorCorrection::Packet*> fec_packets;
189 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 188 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
190 189
191 // Recovery 190 // Recovery
192 auto it = augmented_media_packets.begin(); 191 auto it = augmented_media_packets.begin();
193 BuildAndAddRedMediaPacket(*it); 192 BuildAndAddRedMediaPacket(*it);
194 VerifyReconstructedMediaPacket(**it, 1); 193 VerifyReconstructedMediaPacket(**it, 1);
195 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 194 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
196 // Drop one media packet. 195 // Drop one media packet.
197 auto fec_it = fec_packets.begin(); 196 auto fec_it = fec_packets.begin();
198 BuildAndAddRedFecPacket(*fec_it); 197 BuildAndAddRedFecPacket(*fec_it);
199 ++it; 198 ++it;
200 VerifyReconstructedMediaPacket(**it, 1); 199 VerifyReconstructedMediaPacket(**it, 1);
201 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 200 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
202 201
203 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 202 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
204 EXPECT_EQ(2u, counter.num_packets); 203 EXPECT_EQ(2u, counter.num_packets);
205 EXPECT_EQ(1u, counter.num_fec_packets); 204 EXPECT_EQ(1u, counter.num_fec_packets);
206 EXPECT_EQ(1u, counter.num_recovered_packets); 205 EXPECT_EQ(1u, counter.num_recovered_packets);
207 } 206 }
208 207
209 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { 208 TEST_F(UlpfecReceiverTest, InjectGarbageFecHeaderLengthRecovery) {
210 // Byte offset 8 is the 'length recovery' field of the FEC header. 209 // Byte offset 8 is the 'length recovery' field of the FEC header.
211 InjectGarbagePacketLength(8); 210 InjectGarbagePacketLength(8);
212 } 211 }
213 212
214 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { 213 TEST_F(UlpfecReceiverTest, InjectGarbageFecLevelHeaderProtectionLength) {
215 // Byte offset 10 is the 'protection length' field in the first FEC level 214 // Byte offset 10 is the 'protection length' field in the first FEC level
216 // header. 215 // header.
217 InjectGarbagePacketLength(10); 216 InjectGarbagePacketLength(10);
218 } 217 }
219 218
220 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { 219 TEST_F(UlpfecReceiverTest, TwoMediaTwoFec) {
221 const size_t kNumFecPackets = 2; 220 const size_t kNumFecPackets = 2;
222 std::list<AugmentedPacket*> augmented_media_packets; 221 std::list<AugmentedPacket*> augmented_media_packets;
223 ForwardErrorCorrection::PacketList media_packets; 222 ForwardErrorCorrection::PacketList media_packets;
224 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets); 223 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
225 std::list<ForwardErrorCorrection::Packet*> fec_packets; 224 std::list<ForwardErrorCorrection::Packet*> fec_packets;
226 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 225 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
227 226
228 // Recovery 227 // Recovery
229 // Drop both media packets. 228 // Drop both media packets.
230 auto it = augmented_media_packets.begin(); 229 auto it = augmented_media_packets.begin();
231 auto fec_it = fec_packets.begin(); 230 auto fec_it = fec_packets.begin();
232 BuildAndAddRedFecPacket(*fec_it); 231 BuildAndAddRedFecPacket(*fec_it);
233 VerifyReconstructedMediaPacket(**it, 1); 232 VerifyReconstructedMediaPacket(**it, 1);
234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 233 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
235 ++fec_it; 234 ++fec_it;
236 BuildAndAddRedFecPacket(*fec_it); 235 BuildAndAddRedFecPacket(*fec_it);
237 ++it; 236 ++it;
238 VerifyReconstructedMediaPacket(**it, 1); 237 VerifyReconstructedMediaPacket(**it, 1);
239 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 238 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
240 } 239 }
241 240
242 TEST_F(ReceiverFecTest, TwoFramesOneFec) { 241 TEST_F(UlpfecReceiverTest, TwoFramesOneFec) {
243 const size_t kNumFecPackets = 1; 242 const size_t kNumFecPackets = 1;
244 std::list<AugmentedPacket*> augmented_media_packets; 243 std::list<AugmentedPacket*> augmented_media_packets;
245 ForwardErrorCorrection::PacketList media_packets; 244 ForwardErrorCorrection::PacketList media_packets;
246 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets); 245 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
247 PacketizeFrame(1, 1, &augmented_media_packets, &media_packets); 246 PacketizeFrame(1, 1, &augmented_media_packets, &media_packets);
248 std::list<ForwardErrorCorrection::Packet*> fec_packets; 247 std::list<ForwardErrorCorrection::Packet*> fec_packets;
249 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 248 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
250 249
251 // Recovery 250 // Recovery
252 auto it = augmented_media_packets.begin(); 251 auto it = augmented_media_packets.begin();
253 BuildAndAddRedMediaPacket(augmented_media_packets.front()); 252 BuildAndAddRedMediaPacket(augmented_media_packets.front());
254 VerifyReconstructedMediaPacket(**it, 1); 253 VerifyReconstructedMediaPacket(**it, 1);
255 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 254 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
256 // Drop one media packet. 255 // Drop one media packet.
257 BuildAndAddRedFecPacket(fec_packets.front()); 256 BuildAndAddRedFecPacket(fec_packets.front());
258 ++it; 257 ++it;
259 VerifyReconstructedMediaPacket(**it, 1); 258 VerifyReconstructedMediaPacket(**it, 1);
260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 259 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
261 } 260 }
262 261
263 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { 262 TEST_F(UlpfecReceiverTest, OneCompleteOneUnrecoverableFrame) {
264 const size_t kNumFecPackets = 1; 263 const size_t kNumFecPackets = 1;
265 std::list<AugmentedPacket*> augmented_media_packets; 264 std::list<AugmentedPacket*> augmented_media_packets;
266 ForwardErrorCorrection::PacketList media_packets; 265 ForwardErrorCorrection::PacketList media_packets;
267 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets); 266 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
268 PacketizeFrame(2, 1, &augmented_media_packets, &media_packets); 267 PacketizeFrame(2, 1, &augmented_media_packets, &media_packets);
269 268
270 std::list<ForwardErrorCorrection::Packet*> fec_packets; 269 std::list<ForwardErrorCorrection::Packet*> fec_packets;
271 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 270 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
272 271
273 // Recovery 272 // Recovery
274 auto it = augmented_media_packets.begin(); 273 auto it = augmented_media_packets.begin();
275 BuildAndAddRedMediaPacket(*it); // First frame: one packet. 274 BuildAndAddRedMediaPacket(*it); // First frame: one packet.
276 VerifyReconstructedMediaPacket(**it, 1); 275 VerifyReconstructedMediaPacket(**it, 1);
277 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 276 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
278 ++it; 277 ++it;
279 BuildAndAddRedMediaPacket(*it); // First packet of second frame. 278 BuildAndAddRedMediaPacket(*it); // First packet of second frame.
280 VerifyReconstructedMediaPacket(**it, 1); 279 VerifyReconstructedMediaPacket(**it, 1);
281 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 280 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
282 } 281 }
283 282
284 TEST_F(ReceiverFecTest, MaxFramesOneFec) { 283 TEST_F(UlpfecReceiverTest, MaxFramesOneFec) {
285 const size_t kNumFecPackets = 1; 284 const size_t kNumFecPackets = 1;
286 const size_t kNumMediaPackets = 48; 285 const size_t kNumMediaPackets = 48;
287 std::list<AugmentedPacket*> augmented_media_packets; 286 std::list<AugmentedPacket*> augmented_media_packets;
288 ForwardErrorCorrection::PacketList media_packets; 287 ForwardErrorCorrection::PacketList media_packets;
289 for (size_t i = 0; i < kNumMediaPackets; ++i) { 288 for (size_t i = 0; i < kNumMediaPackets; ++i) {
290 PacketizeFrame(1, i, &augmented_media_packets, &media_packets); 289 PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
291 } 290 }
292 std::list<ForwardErrorCorrection::Packet*> fec_packets; 291 std::list<ForwardErrorCorrection::Packet*> fec_packets;
293 EncodeFec(media_packets, kNumFecPackets, &fec_packets); 292 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
294 293
295 // Recovery 294 // Recovery
296 auto it = augmented_media_packets.begin(); 295 auto it = augmented_media_packets.begin();
297 ++it; // Drop first packet. 296 ++it; // Drop first packet.
298 for (; it != augmented_media_packets.end(); ++it) { 297 for (; it != augmented_media_packets.end(); ++it) {
299 BuildAndAddRedMediaPacket(*it); 298 BuildAndAddRedMediaPacket(*it);
300 VerifyReconstructedMediaPacket(**it, 1); 299 VerifyReconstructedMediaPacket(**it, 1);
301 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 300 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
302 } 301 }
303 BuildAndAddRedFecPacket(fec_packets.front()); 302 BuildAndAddRedFecPacket(fec_packets.front());
304 it = augmented_media_packets.begin(); 303 it = augmented_media_packets.begin();
305 VerifyReconstructedMediaPacket(**it, 1); 304 VerifyReconstructedMediaPacket(**it, 1);
306 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 305 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
307 } 306 }
308 307
309 TEST_F(ReceiverFecTest, TooManyFrames) { 308 TEST_F(UlpfecReceiverTest, TooManyFrames) {
310 const size_t kNumFecPackets = 1; 309 const size_t kNumFecPackets = 1;
311 const size_t kNumMediaPackets = 49; 310 const size_t kNumMediaPackets = 49;
312 std::list<AugmentedPacket*> augmented_media_packets; 311 std::list<AugmentedPacket*> augmented_media_packets;
313 ForwardErrorCorrection::PacketList media_packets; 312 ForwardErrorCorrection::PacketList media_packets;
314 for (size_t i = 0; i < kNumMediaPackets; ++i) { 313 for (size_t i = 0; i < kNumMediaPackets; ++i) {
315 PacketizeFrame(1, i, &augmented_media_packets, &media_packets); 314 PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
316 } 315 }
317 std::list<ForwardErrorCorrection::Packet*> fec_packets; 316 std::list<ForwardErrorCorrection::Packet*> fec_packets;
318 EXPECT_EQ(-1, fec_->EncodeFec(media_packets, 317 EXPECT_EQ(-1, fec_->EncodeFec(media_packets,
319 kNumFecPackets * 255 / kNumMediaPackets, 0, 318 kNumFecPackets * 255 / kNumMediaPackets, 0,
320 false, kFecMaskBursty, &fec_packets)); 319 false, kFecMaskBursty, &fec_packets));
321 } 320 }
322 321
323 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { 322 TEST_F(UlpfecReceiverTest, PacketNotDroppedTooEarly) {
324 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 323 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
325 // Delay the FEC packet. 324 // Delay the FEC packet.
326 Packet* delayed_fec = nullptr; 325 Packet* delayed_fec = nullptr;
327 const size_t kNumFecPacketsBatch1 = 1; 326 const size_t kNumFecPacketsBatch1 = 1;
328 const size_t kNumMediaPacketsBatch1 = 2; 327 const size_t kNumMediaPacketsBatch1 = 2;
329 std::list<AugmentedPacket*> augmented_media_packets_batch1; 328 std::list<AugmentedPacket*> augmented_media_packets_batch1;
330 ForwardErrorCorrection::PacketList media_packets_batch1; 329 ForwardErrorCorrection::PacketList media_packets_batch1;
331 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, 330 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
332 &media_packets_batch1); 331 &media_packets_batch1);
333 std::list<ForwardErrorCorrection::Packet*> fec_packets; 332 std::list<ForwardErrorCorrection::Packet*> fec_packets;
334 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); 333 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
335 334
336 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); 335 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
337 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 336 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
338 .Times(1).WillRepeatedly(Return(true)); 337 .Times(1)
338 .WillRepeatedly(Return(true));
339 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 339 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
340 delayed_fec = fec_packets.front(); 340 delayed_fec = fec_packets.front();
341 341
342 // Fill the FEC decoder. No packets should be dropped. 342 // Fill the FEC decoder. No packets should be dropped.
343 const size_t kNumMediaPacketsBatch2 = 46; 343 const size_t kNumMediaPacketsBatch2 = 46;
344 std::list<AugmentedPacket*> augmented_media_packets_batch2; 344 std::list<AugmentedPacket*> augmented_media_packets_batch2;
345 ForwardErrorCorrection::PacketList media_packets_batch2; 345 ForwardErrorCorrection::PacketList media_packets_batch2;
346 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { 346 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
347 PacketizeFrame(1, i, &augmented_media_packets_batch2, 347 PacketizeFrame(1, i, &augmented_media_packets_batch2,
348 &media_packets_batch2); 348 &media_packets_batch2);
349 } 349 }
350 for (auto it = augmented_media_packets_batch2.begin(); 350 for (auto it = augmented_media_packets_batch2.begin();
351 it != augmented_media_packets_batch2.end(); ++it) { 351 it != augmented_media_packets_batch2.end(); ++it) {
352 BuildAndAddRedMediaPacket(*it); 352 BuildAndAddRedMediaPacket(*it);
353 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 353 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
354 .Times(1).WillRepeatedly(Return(true)); 354 .Times(1)
355 .WillRepeatedly(Return(true));
355 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 356 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
356 } 357 }
357 358
358 // Add the delayed FEC packet. One packet should be reconstructed. 359 // Add the delayed FEC packet. One packet should be reconstructed.
359 BuildAndAddRedFecPacket(delayed_fec); 360 BuildAndAddRedFecPacket(delayed_fec);
360 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 361 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
361 .Times(1).WillRepeatedly(Return(true)); 362 .Times(1)
363 .WillRepeatedly(Return(true));
362 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 364 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
363 } 365 }
364 366
365 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { 367 TEST_F(UlpfecReceiverTest, PacketDroppedWhenTooOld) {
366 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 368 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
367 // Delay the FEC packet. 369 // Delay the FEC packet.
368 Packet* delayed_fec = nullptr; 370 Packet* delayed_fec = nullptr;
369 const size_t kNumFecPacketsBatch1 = 1; 371 const size_t kNumFecPacketsBatch1 = 1;
370 const size_t kNumMediaPacketsBatch1 = 2; 372 const size_t kNumMediaPacketsBatch1 = 2;
371 std::list<AugmentedPacket*> augmented_media_packets_batch1; 373 std::list<AugmentedPacket*> augmented_media_packets_batch1;
372 ForwardErrorCorrection::PacketList media_packets_batch1; 374 ForwardErrorCorrection::PacketList media_packets_batch1;
373 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1, 375 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
374 &media_packets_batch1); 376 &media_packets_batch1);
375 std::list<ForwardErrorCorrection::Packet*> fec_packets; 377 std::list<ForwardErrorCorrection::Packet*> fec_packets;
376 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets); 378 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
377 379
378 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front()); 380 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
379 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 381 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
380 .Times(1).WillRepeatedly(Return(true)); 382 .Times(1)
383 .WillRepeatedly(Return(true));
381 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 384 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
382 delayed_fec = fec_packets.front(); 385 delayed_fec = fec_packets.front();
383 386
384 // Fill the FEC decoder and force the last packet to be dropped. 387 // Fill the FEC decoder and force the last packet to be dropped.
385 const size_t kNumMediaPacketsBatch2 = 48; 388 const size_t kNumMediaPacketsBatch2 = 48;
386 std::list<AugmentedPacket*> augmented_media_packets_batch2; 389 std::list<AugmentedPacket*> augmented_media_packets_batch2;
387 ForwardErrorCorrection::PacketList media_packets_batch2; 390 ForwardErrorCorrection::PacketList media_packets_batch2;
388 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) { 391 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
389 PacketizeFrame(1, i, &augmented_media_packets_batch2, 392 PacketizeFrame(1, i, &augmented_media_packets_batch2,
390 &media_packets_batch2); 393 &media_packets_batch2);
391 } 394 }
392 for (auto it = augmented_media_packets_batch2.begin(); 395 for (auto it = augmented_media_packets_batch2.begin();
393 it != augmented_media_packets_batch2.end(); ++it) { 396 it != augmented_media_packets_batch2.end(); ++it) {
394 BuildAndAddRedMediaPacket(*it); 397 BuildAndAddRedMediaPacket(*it);
395 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 398 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
396 .Times(1).WillRepeatedly(Return(true)); 399 .Times(1)
400 .WillRepeatedly(Return(true));
397 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 401 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
398 } 402 }
399 403
400 // Add the delayed FEC packet. No packet should be reconstructed since the 404 // Add the delayed FEC packet. No packet should be reconstructed since the
401 // first media packet of that frame has been dropped due to being too old. 405 // first media packet of that frame has been dropped due to being too old.
402 BuildAndAddRedFecPacket(delayed_fec); 406 BuildAndAddRedFecPacket(delayed_fec);
403 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 407 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)).Times(0);
404 .Times(0);
405 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 408 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
406 } 409 }
407 410
408 TEST_F(ReceiverFecTest, OldFecPacketDropped) { 411 TEST_F(UlpfecReceiverTest, OldFecPacketDropped) {
409 // 49 frames with 2 media packets and one FEC packet. All media packets 412 // 49 frames with 2 media packets and one FEC packet. All media packets
410 // missing. 413 // missing.
411 const size_t kNumMediaPackets = 49 * 2; 414 const size_t kNumMediaPackets = 49 * 2;
412 std::list<AugmentedPacket*> augmented_media_packets; 415 std::list<AugmentedPacket*> augmented_media_packets;
413 ForwardErrorCorrection::PacketList media_packets; 416 ForwardErrorCorrection::PacketList media_packets;
414 for (size_t i = 0; i < kNumMediaPackets / 2; ++i) { 417 for (size_t i = 0; i < kNumMediaPackets / 2; ++i) {
415 std::list<AugmentedPacket*> frame_augmented_media_packets; 418 std::list<AugmentedPacket*> frame_augmented_media_packets;
416 ForwardErrorCorrection::PacketList frame_media_packets; 419 ForwardErrorCorrection::PacketList frame_media_packets;
417 std::list<ForwardErrorCorrection::Packet*> fec_packets; 420 std::list<ForwardErrorCorrection::Packet*> fec_packets;
418 PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets); 421 PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets);
419 EncodeFec(frame_media_packets, 1, &fec_packets); 422 EncodeFec(frame_media_packets, 1, &fec_packets);
420 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { 423 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) {
421 // Only FEC packets inserted. No packets recoverable at this time. 424 // Only FEC packets inserted. No packets recoverable at this time.
422 BuildAndAddRedFecPacket(*it); 425 BuildAndAddRedFecPacket(*it);
423 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 426 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)).Times(0);
424 .Times(0);
425 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 427 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
426 } 428 }
427 // Move unique_ptr's to media_packets for lifetime management. 429 // Move unique_ptr's to media_packets for lifetime management.
428 media_packets.insert(media_packets.end(), 430 media_packets.insert(media_packets.end(),
429 std::make_move_iterator(frame_media_packets.begin()), 431 std::make_move_iterator(frame_media_packets.begin()),
430 std::make_move_iterator(frame_media_packets.end())); 432 std::make_move_iterator(frame_media_packets.end()));
431 augmented_media_packets.insert(augmented_media_packets.end(), 433 augmented_media_packets.insert(augmented_media_packets.end(),
432 frame_augmented_media_packets.begin(), 434 frame_augmented_media_packets.begin(),
433 frame_augmented_media_packets.end()); 435 frame_augmented_media_packets.end());
434 } 436 }
435 // Insert the oldest media packet. The corresponding FEC packet is too old 437 // Insert the oldest media packet. The corresponding FEC packet is too old
436 // and should have been dropped. Only the media packet we inserted will be 438 // and should have been dropped. Only the media packet we inserted will be
437 // returned. 439 // returned.
438 BuildAndAddRedMediaPacket(augmented_media_packets.front()); 440 BuildAndAddRedMediaPacket(augmented_media_packets.front());
439 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 441 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
440 .Times(1).WillRepeatedly(Return(true)); 442 .Times(1)
443 .WillRepeatedly(Return(true));
441 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 444 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
442 } 445 }
443 446
444 TEST_F(ReceiverFecTest, TruncatedPacketWithFBitSet) { 447 TEST_F(UlpfecReceiverTest, TruncatedPacketWithFBitSet) {
445 const uint8_t kTruncatedPacket[] = {0x80, 448 const uint8_t kTruncatedPacket[] = {0x80, 0x2a, 0x68, 0x71, 0x29, 0xa1, 0x27,
446 0x2a, 449 0x3a, 0x29, 0x12, 0x2a, 0x98, 0xe0, 0x29};
447 0x68,
448 0x71,
449 0x29,
450 0xa1,
451 0x27,
452 0x3a,
453 0x29,
454 0x12,
455 0x2a,
456 0x98,
457 0xe0,
458 0x29};
459 450
460 SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100); 451 SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100);
461 } 452 }
462 453
463 TEST_F(ReceiverFecTest, TruncatedPacketWithFBitSetEndingAfterFirstRedHeader) { 454 TEST_F(UlpfecReceiverTest,
464 const uint8_t kPacket[] = {0x89, 455 TruncatedPacketWithFBitSetEndingAfterFirstRedHeader) {
465 0x27, 456 const uint8_t kPacket[] = {
466 0x3a, 457 0x89, 0x27, 0x3a, 0x83, 0x27, 0x3a, 0x3a, 0xf3, 0x67, 0xbe, 0x2a,
467 0x83, 458 0xa9, 0x27, 0x54, 0x3a, 0x3a, 0x2a, 0x67, 0x3a, 0xf3, 0x67, 0xbe,
468 0x27, 459 0x2a, 0x27, 0xe6, 0xf6, 0x03, 0x3e, 0x29, 0x27, 0x21, 0x27, 0x2a,
469 0x3a, 460 0x29, 0x21, 0x4b, 0x29, 0x3a, 0x28, 0x29, 0xbf, 0x29, 0x2a, 0x26,
470 0x3a, 461 0x29, 0xae, 0x27, 0xa6, 0xf6, 0x00, 0x03, 0x3e};
471 0xf3,
472 0x67,
473 0xbe,
474 0x2a,
475 0xa9,
476 0x27,
477 0x54,
478 0x3a,
479 0x3a,
480 0x2a,
481 0x67,
482 0x3a,
483 0xf3,
484 0x67,
485 0xbe,
486 0x2a,
487 0x27,
488 0xe6,
489 0xf6,
490 0x03,
491 0x3e,
492 0x29,
493 0x27,
494 0x21,
495 0x27,
496 0x2a,
497 0x29,
498 0x21,
499 0x4b,
500 0x29,
501 0x3a,
502 0x28,
503 0x29,
504 0xbf,
505 0x29,
506 0x2a,
507 0x26,
508 0x29,
509 0xae,
510 0x27,
511 0xa6,
512 0xf6,
513 0x00,
514 0x03,
515 0x3e};
516 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 462 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
517 } 463 }
518 464
519 TEST_F(ReceiverFecTest, TruncatedPacketWithoutDataPastFirstBlock) { 465 TEST_F(UlpfecReceiverTest, TruncatedPacketWithoutDataPastFirstBlock) {
520 const uint8_t kPacket[] = {0x82, 466 const uint8_t kPacket[] = {
521 0x38, 467 0x82, 0x38, 0x92, 0x38, 0x92, 0x38, 0xde, 0x2a, 0x11, 0xc8, 0xa3, 0xc4,
522 0x92, 468 0x82, 0x38, 0x2a, 0x21, 0x2a, 0x28, 0x92, 0x38, 0x92, 0x00, 0x00, 0x0a,
523 0x38, 469 0x3a, 0xc8, 0xa3, 0x3a, 0x27, 0xc4, 0x2a, 0x21, 0x2a, 0x28};
524 0x92,
525 0x38,
526 0xde,
527 0x2a,
528 0x11,
529 0xc8,
530 0xa3,
531 0xc4,
532 0x82,
533 0x38,
534 0x2a,
535 0x21,
536 0x2a,
537 0x28,
538 0x92,
539 0x38,
540 0x92,
541 0x00,
542 0x00,
543 0x0a,
544 0x3a,
545 0xc8,
546 0xa3,
547 0x3a,
548 0x27,
549 0xc4,
550 0x2a,
551 0x21,
552 0x2a,
553 0x28};
554 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 470 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
555 } 471 }
556 472
557 } // namespace webrtc 473 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc ('k') | webrtc/video/rtp_stream_receiver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698