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

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

Issue 2099243003: Use std::unique_ptr in ForwardErrorCorrection. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@flexfec-pt1a_mini-fixes-in-ULPFEC
Patch Set: Lint fixes. Created 4 years, 5 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
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
(...skipping 21 matching lines...) Expand all
32 32
33 class ReceiverFecTest : public ::testing::Test { 33 class ReceiverFecTest : public ::testing::Test {
34 protected: 34 protected:
35 virtual void SetUp() { 35 virtual void SetUp() {
36 fec_.reset(new ForwardErrorCorrection()); 36 fec_.reset(new ForwardErrorCorrection());
37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); 37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_));
38 generator_.reset(new FrameGenerator()); 38 generator_.reset(new FrameGenerator());
39 } 39 }
40 40
41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets, 41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets,
42 ForwardErrorCorrection::PacketList* fec_packets, 42 std::list<ForwardErrorCorrection::Packet*>* fec_packets,
43 unsigned int num_fec_packets) { 43 unsigned int num_fec_packets) {
44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); 44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size();
45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor, 45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor,
46 0, false, kFecMaskBursty, fec_packets)); 46 0, false, kFecMaskBursty, fec_packets));
47 ASSERT_EQ(num_fec_packets, fec_packets->size()); 47 ASSERT_EQ(num_fec_packets, fec_packets->size());
48 } 48 }
49 49
50 void GenerateFrame(int num_media_packets, 50 void GenerateFrame(int num_media_packets,
51 int frame_offset, 51 int frame_offset,
52 std::list<test::RawRtpPacket*>* media_rtp_packets, 52 std::list<test::RawRtpPacket*>* media_rtp_packets,
53 ForwardErrorCorrection::PacketList* media_packets) { 53 ForwardErrorCorrection::PacketList* media_packets) {
54 generator_->NewFrame(num_media_packets); 54 generator_->NewFrame(num_media_packets);
55 for (int i = 0; i < num_media_packets; ++i) { 55 for (int i = 0; i < num_media_packets; ++i) {
56 media_rtp_packets->push_back( 56 media_rtp_packets->push_back(
57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); 57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10));
58 media_packets->push_back(media_rtp_packets->back()); 58 media_packets->push_back(
59 std::unique_ptr<ForwardErrorCorrection::Packet>(
60 media_rtp_packets->back()));
59 } 61 }
60 } 62 }
61 63
62 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, 64 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet,
63 int times) { 65 int times) {
64 // Verify that the content of the reconstructed packet is equal to the 66 // Verify that the content of the reconstructed packet is equal to the
65 // content of |packet|, and that the same content is received |times| number 67 // content of |packet|, and that the same content is received |times| number
66 // of times in a row. 68 // of times in a row.
67 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) 69 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length))
68 .With(Args<0, 1>(ElementsAreArray(packet->data, 70 .With(Args<0, 1>(ElementsAreArray(packet->data,
(...skipping 21 matching lines...) Expand all
90 static void SurvivesMaliciousPacket(const uint8_t* data, 92 static void SurvivesMaliciousPacket(const uint8_t* data,
91 size_t length, 93 size_t length,
92 uint8_t ulpfec_payload_type); 94 uint8_t ulpfec_payload_type);
93 95
94 MockRtpData rtp_data_callback_; 96 MockRtpData rtp_data_callback_;
95 std::unique_ptr<ForwardErrorCorrection> fec_; 97 std::unique_ptr<ForwardErrorCorrection> fec_;
96 std::unique_ptr<FecReceiver> receiver_fec_; 98 std::unique_ptr<FecReceiver> receiver_fec_;
97 std::unique_ptr<FrameGenerator> generator_; 99 std::unique_ptr<FrameGenerator> generator_;
98 }; 100 };
99 101
100 void DeletePackets(ForwardErrorCorrection::PacketList* packets) {
101 while (!packets->empty()) {
102 delete packets->front();
103 packets->pop_front();
104 }
105 }
106
107 TEST_F(ReceiverFecTest, TwoMediaOneFec) { 102 TEST_F(ReceiverFecTest, TwoMediaOneFec) {
108 const unsigned int kNumFecPackets = 1u; 103 const unsigned int kNumFecPackets = 1u;
109 std::list<test::RawRtpPacket*> media_rtp_packets; 104 std::list<test::RawRtpPacket*> media_rtp_packets;
110 ForwardErrorCorrection::PacketList media_packets; 105 ForwardErrorCorrection::PacketList media_packets;
111 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 106 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
112 ForwardErrorCorrection::PacketList fec_packets; 107 std::list<ForwardErrorCorrection::Packet*> fec_packets;
113 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 108 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
114 109
115 // Recovery 110 // Recovery
116 auto it = media_rtp_packets.begin(); 111 auto it = media_rtp_packets.begin();
117 BuildAndAddRedMediaPacket(*it); 112 BuildAndAddRedMediaPacket(*it);
118 VerifyReconstructedMediaPacket(*it, 1); 113 VerifyReconstructedMediaPacket(*it, 1);
119 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 114 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
120 // Drop one media packet. 115 // Drop one media packet.
121 auto fec_it = fec_packets.begin(); 116 auto fec_it = fec_packets.begin();
122 BuildAndAddRedFecPacket(*fec_it); 117 BuildAndAddRedFecPacket(*fec_it);
123 ++it; 118 ++it;
124 VerifyReconstructedMediaPacket(*it, 1); 119 VerifyReconstructedMediaPacket(*it, 1);
125 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 120 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
126 121
127 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 122 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
128 EXPECT_EQ(2U, counter.num_packets); 123 EXPECT_EQ(2U, counter.num_packets);
129 EXPECT_EQ(1U, counter.num_fec_packets); 124 EXPECT_EQ(1U, counter.num_fec_packets);
130 EXPECT_EQ(1U, counter.num_recovered_packets); 125 EXPECT_EQ(1U, counter.num_recovered_packets);
131
132 DeletePackets(&media_packets);
133 } 126 }
134 127
135 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { 128 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
136 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 129 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
137 .WillRepeatedly(Return(true)); 130 .WillRepeatedly(Return(true));
138 131
139 const unsigned int kNumFecPackets = 1u; 132 const unsigned int kNumFecPackets = 1u;
140 std::list<test::RawRtpPacket*> media_rtp_packets; 133 std::list<test::RawRtpPacket*> media_rtp_packets;
141 ForwardErrorCorrection::PacketList media_packets; 134 ForwardErrorCorrection::PacketList media_packets;
142 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 135 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
143 ForwardErrorCorrection::PacketList fec_packets; 136 std::list<ForwardErrorCorrection::Packet*> fec_packets;
144 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 137 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
145 ByteWriter<uint16_t>::WriteBigEndian( 138 ByteWriter<uint16_t>::WriteBigEndian(
146 &fec_packets.front()->data[fec_garbage_offset], 0x4711); 139 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
147 140
148 // Inject first media packet, then first FEC packet, skipping the second media 141 // Inject first media packet, then first FEC packet, skipping the second media
149 // packet to cause a recovery from the FEC packet. 142 // packet to cause a recovery from the FEC packet.
150 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 143 BuildAndAddRedMediaPacket(media_rtp_packets.front());
151 BuildAndAddRedFecPacket(fec_packets.front()); 144 BuildAndAddRedFecPacket(fec_packets.front());
152 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 145 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
153 146
154 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 147 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
155 EXPECT_EQ(2u, counter.num_packets); 148 EXPECT_EQ(2u, counter.num_packets);
156 EXPECT_EQ(1u, counter.num_fec_packets); 149 EXPECT_EQ(1u, counter.num_fec_packets);
157 EXPECT_EQ(0u, counter.num_recovered_packets); 150 EXPECT_EQ(0u, counter.num_recovered_packets);
158
159 DeletePackets(&media_packets);
160 } 151 }
161 152
162 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { 153 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) {
163 // Byte offset 8 is the 'length recovery' field of the FEC header. 154 // Byte offset 8 is the 'length recovery' field of the FEC header.
164 InjectGarbagePacketLength(8); 155 InjectGarbagePacketLength(8);
165 } 156 }
166 157
167 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { 158 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) {
168 // Byte offset 10 is the 'protection length' field in the first FEC level 159 // Byte offset 10 is the 'protection length' field in the first FEC level
169 // header. 160 // header.
170 InjectGarbagePacketLength(10); 161 InjectGarbagePacketLength(10);
171 } 162 }
172 163
173 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { 164 TEST_F(ReceiverFecTest, TwoMediaTwoFec) {
174 const unsigned int kNumFecPackets = 2u; 165 const unsigned int kNumFecPackets = 2u;
175 std::list<test::RawRtpPacket*> media_rtp_packets; 166 std::list<test::RawRtpPacket*> media_rtp_packets;
176 ForwardErrorCorrection::PacketList media_packets; 167 ForwardErrorCorrection::PacketList media_packets;
177 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 168 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
178 ForwardErrorCorrection::PacketList fec_packets; 169 std::list<ForwardErrorCorrection::Packet*> fec_packets;
179 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 170 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
180 171
181 // Recovery 172 // Recovery
182 // Drop both media packets. 173 // Drop both media packets.
183 auto it = media_rtp_packets.begin(); 174 auto it = media_rtp_packets.begin();
184 auto fec_it = fec_packets.begin(); 175 auto fec_it = fec_packets.begin();
185 BuildAndAddRedFecPacket(*fec_it); 176 BuildAndAddRedFecPacket(*fec_it);
186 VerifyReconstructedMediaPacket(*it, 1); 177 VerifyReconstructedMediaPacket(*it, 1);
187 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 178 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
188 ++fec_it; 179 ++fec_it;
189 BuildAndAddRedFecPacket(*fec_it); 180 BuildAndAddRedFecPacket(*fec_it);
190 ++it; 181 ++it;
191 VerifyReconstructedMediaPacket(*it, 1); 182 VerifyReconstructedMediaPacket(*it, 1);
192 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 183 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
193
194 DeletePackets(&media_packets);
195 } 184 }
196 185
197 TEST_F(ReceiverFecTest, TwoFramesOneFec) { 186 TEST_F(ReceiverFecTest, TwoFramesOneFec) {
198 const unsigned int kNumFecPackets = 1u; 187 const unsigned int kNumFecPackets = 1u;
199 std::list<test::RawRtpPacket*> media_rtp_packets; 188 std::list<test::RawRtpPacket*> media_rtp_packets;
200 ForwardErrorCorrection::PacketList media_packets; 189 ForwardErrorCorrection::PacketList media_packets;
201 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 190 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
202 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); 191 GenerateFrame(1, 1, &media_rtp_packets, &media_packets);
203 ForwardErrorCorrection::PacketList fec_packets; 192 std::list<ForwardErrorCorrection::Packet*> fec_packets;
204 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 193 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
205 194
206 // Recovery 195 // Recovery
207 auto it = media_rtp_packets.begin(); 196 auto it = media_rtp_packets.begin();
208 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 197 BuildAndAddRedMediaPacket(media_rtp_packets.front());
209 VerifyReconstructedMediaPacket(*it, 1); 198 VerifyReconstructedMediaPacket(*it, 1);
210 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 199 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
211 // Drop one media packet. 200 // Drop one media packet.
212 BuildAndAddRedFecPacket(fec_packets.front()); 201 BuildAndAddRedFecPacket(fec_packets.front());
213 ++it; 202 ++it;
214 VerifyReconstructedMediaPacket(*it, 1); 203 VerifyReconstructedMediaPacket(*it, 1);
215 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 204 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
216
217 DeletePackets(&media_packets);
218 } 205 }
219 206
220 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { 207 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) {
221 const unsigned int kNumFecPackets = 1u; 208 const unsigned int kNumFecPackets = 1u;
222 std::list<test::RawRtpPacket*> media_rtp_packets; 209 std::list<test::RawRtpPacket*> media_rtp_packets;
223 ForwardErrorCorrection::PacketList media_packets; 210 ForwardErrorCorrection::PacketList media_packets;
224 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 211 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
225 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); 212 GenerateFrame(2, 1, &media_rtp_packets, &media_packets);
226 213
227 ForwardErrorCorrection::PacketList fec_packets; 214 std::list<ForwardErrorCorrection::Packet*> fec_packets;
228 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 215 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
229 216
230 // Recovery 217 // Recovery
231 auto it = media_rtp_packets.begin(); 218 auto it = media_rtp_packets.begin();
232 BuildAndAddRedMediaPacket(*it); // First frame: one packet. 219 BuildAndAddRedMediaPacket(*it); // First frame: one packet.
233 VerifyReconstructedMediaPacket(*it, 1); 220 VerifyReconstructedMediaPacket(*it, 1);
234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 221 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
235 ++it; 222 ++it;
236 BuildAndAddRedMediaPacket(*it); // First packet of second frame. 223 BuildAndAddRedMediaPacket(*it); // First packet of second frame.
237 VerifyReconstructedMediaPacket(*it, 1); 224 VerifyReconstructedMediaPacket(*it, 1);
238 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 225 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
239
240 DeletePackets(&media_packets);
241 } 226 }
242 227
243 TEST_F(ReceiverFecTest, MaxFramesOneFec) { 228 TEST_F(ReceiverFecTest, MaxFramesOneFec) {
244 const unsigned int kNumFecPackets = 1u; 229 const unsigned int kNumFecPackets = 1u;
245 const unsigned int kNumMediaPackets = 48u; 230 const unsigned int kNumMediaPackets = 48u;
246 std::list<test::RawRtpPacket*> media_rtp_packets; 231 std::list<test::RawRtpPacket*> media_rtp_packets;
247 ForwardErrorCorrection::PacketList media_packets; 232 ForwardErrorCorrection::PacketList media_packets;
248 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 233 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
249 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 234 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
250 } 235 }
251 ForwardErrorCorrection::PacketList fec_packets; 236 std::list<ForwardErrorCorrection::Packet*> fec_packets;
252 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 237 GenerateFec(&media_packets, &fec_packets, kNumFecPackets);
253 238
254 // Recovery 239 // Recovery
255 auto it = media_rtp_packets.begin(); 240 auto it = media_rtp_packets.begin();
256 ++it; // Drop first packet. 241 ++it; // Drop first packet.
257 for (; it != media_rtp_packets.end(); ++it) { 242 for (; it != media_rtp_packets.end(); ++it) {
258 BuildAndAddRedMediaPacket(*it); 243 BuildAndAddRedMediaPacket(*it);
259 VerifyReconstructedMediaPacket(*it, 1); 244 VerifyReconstructedMediaPacket(*it, 1);
260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 245 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
261 } 246 }
262 BuildAndAddRedFecPacket(fec_packets.front()); 247 BuildAndAddRedFecPacket(fec_packets.front());
263 it = media_rtp_packets.begin(); 248 it = media_rtp_packets.begin();
264 VerifyReconstructedMediaPacket(*it, 1); 249 VerifyReconstructedMediaPacket(*it, 1);
265 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 250 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
266
267 DeletePackets(&media_packets);
268 } 251 }
269 252
270 TEST_F(ReceiverFecTest, TooManyFrames) { 253 TEST_F(ReceiverFecTest, TooManyFrames) {
271 const unsigned int kNumFecPackets = 1u; 254 const unsigned int kNumFecPackets = 1u;
272 const unsigned int kNumMediaPackets = 49u; 255 const unsigned int kNumMediaPackets = 49u;
273 std::list<test::RawRtpPacket*> media_rtp_packets; 256 std::list<test::RawRtpPacket*> media_rtp_packets;
274 ForwardErrorCorrection::PacketList media_packets; 257 ForwardErrorCorrection::PacketList media_packets;
275 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 258 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
276 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 259 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
277 } 260 }
278 ForwardErrorCorrection::PacketList fec_packets; 261 std::list<ForwardErrorCorrection::Packet*> fec_packets;
279 EXPECT_EQ(-1, fec_->GenerateFec(media_packets, 262 EXPECT_EQ(-1, fec_->GenerateFec(media_packets,
280 kNumFecPackets * 255 / kNumMediaPackets, 0, 263 kNumFecPackets * 255 / kNumMediaPackets, 0,
281 false, kFecMaskBursty, &fec_packets)); 264 false, kFecMaskBursty, &fec_packets));
282
283 DeletePackets(&media_packets);
284 } 265 }
285 266
286 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { 267 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) {
287 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 268 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
288 // Delay the FEC packet. 269 // Delay the FEC packet.
289 Packet* delayed_fec = NULL; 270 Packet* delayed_fec = NULL;
290 const unsigned int kNumFecPacketsBatch1 = 1u; 271 const unsigned int kNumFecPacketsBatch1 = 1u;
291 const unsigned int kNumMediaPacketsBatch1 = 2u; 272 const unsigned int kNumMediaPacketsBatch1 = 2u;
292 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; 273 std::list<test::RawRtpPacket*> media_rtp_packets_batch1;
293 ForwardErrorCorrection::PacketList media_packets_batch1; 274 ForwardErrorCorrection::PacketList media_packets_batch1;
294 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 275 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
295 &media_packets_batch1); 276 &media_packets_batch1);
296 ForwardErrorCorrection::PacketList fec_packets; 277 std::list<ForwardErrorCorrection::Packet*> fec_packets;
297 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 278 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
298 279
299 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 280 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
300 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 281 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
301 .Times(1).WillRepeatedly(Return(true)); 282 .Times(1).WillRepeatedly(Return(true));
302 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 283 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
303 delayed_fec = fec_packets.front(); 284 delayed_fec = fec_packets.front();
304 285
305 // Fill the FEC decoder. No packets should be dropped. 286 // Fill the FEC decoder. No packets should be dropped.
306 const unsigned int kNumMediaPacketsBatch2 = 46u; 287 const unsigned int kNumMediaPacketsBatch2 = 46u;
307 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; 288 std::list<test::RawRtpPacket*> media_rtp_packets_batch2;
308 ForwardErrorCorrection::PacketList media_packets_batch2; 289 ForwardErrorCorrection::PacketList media_packets_batch2;
309 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 290 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
310 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 291 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
311 } 292 }
312 for (auto it = media_rtp_packets_batch2.begin(); 293 for (auto it = media_rtp_packets_batch2.begin();
313 it != media_rtp_packets_batch2.end(); ++it) { 294 it != media_rtp_packets_batch2.end(); ++it) {
314 BuildAndAddRedMediaPacket(*it); 295 BuildAndAddRedMediaPacket(*it);
315 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 296 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
316 .Times(1).WillRepeatedly(Return(true)); 297 .Times(1).WillRepeatedly(Return(true));
317 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 298 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
318 } 299 }
319 300
320 // Add the delayed FEC packet. One packet should be reconstructed. 301 // Add the delayed FEC packet. One packet should be reconstructed.
321 BuildAndAddRedFecPacket(delayed_fec); 302 BuildAndAddRedFecPacket(delayed_fec);
322 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 303 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
323 .Times(1).WillRepeatedly(Return(true)); 304 .Times(1).WillRepeatedly(Return(true));
324 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 305 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
325
326 DeletePackets(&media_packets_batch1);
327 DeletePackets(&media_packets_batch2);
328 } 306 }
329 307
330 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { 308 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) {
331 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 309 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
332 // Delay the FEC packet. 310 // Delay the FEC packet.
333 Packet* delayed_fec = NULL; 311 Packet* delayed_fec = NULL;
334 const unsigned int kNumFecPacketsBatch1 = 1u; 312 const unsigned int kNumFecPacketsBatch1 = 1u;
335 const unsigned int kNumMediaPacketsBatch1 = 2u; 313 const unsigned int kNumMediaPacketsBatch1 = 2u;
336 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; 314 std::list<test::RawRtpPacket*> media_rtp_packets_batch1;
337 ForwardErrorCorrection::PacketList media_packets_batch1; 315 ForwardErrorCorrection::PacketList media_packets_batch1;
338 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 316 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
339 &media_packets_batch1); 317 &media_packets_batch1);
340 ForwardErrorCorrection::PacketList fec_packets; 318 std::list<ForwardErrorCorrection::Packet*> fec_packets;
341 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 319 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
342 320
343 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 321 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
344 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 322 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
345 .Times(1).WillRepeatedly(Return(true)); 323 .Times(1).WillRepeatedly(Return(true));
346 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 324 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
347 delayed_fec = fec_packets.front(); 325 delayed_fec = fec_packets.front();
348 326
349 // Fill the FEC decoder and force the last packet to be dropped. 327 // Fill the FEC decoder and force the last packet to be dropped.
350 const unsigned int kNumMediaPacketsBatch2 = 48u; 328 const unsigned int kNumMediaPacketsBatch2 = 48u;
351 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; 329 std::list<test::RawRtpPacket*> media_rtp_packets_batch2;
352 ForwardErrorCorrection::PacketList media_packets_batch2; 330 ForwardErrorCorrection::PacketList media_packets_batch2;
353 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 331 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
354 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 332 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
355 } 333 }
356 for (auto it = media_rtp_packets_batch2.begin(); 334 for (auto it = media_rtp_packets_batch2.begin();
357 it != media_rtp_packets_batch2.end(); ++it) { 335 it != media_rtp_packets_batch2.end(); ++it) {
358 BuildAndAddRedMediaPacket(*it); 336 BuildAndAddRedMediaPacket(*it);
359 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 337 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
360 .Times(1).WillRepeatedly(Return(true)); 338 .Times(1).WillRepeatedly(Return(true));
361 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 339 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
362 } 340 }
363 341
364 // Add the delayed FEC packet. No packet should be reconstructed since the 342 // Add the delayed FEC packet. No packet should be reconstructed since the
365 // first media packet of that frame has been dropped due to being too old. 343 // first media packet of that frame has been dropped due to being too old.
366 BuildAndAddRedFecPacket(delayed_fec); 344 BuildAndAddRedFecPacket(delayed_fec);
367 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 345 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
368 .Times(0); 346 .Times(0);
369 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 347 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
370
371 DeletePackets(&media_packets_batch1);
372 DeletePackets(&media_packets_batch2);
373 } 348 }
374 349
375 TEST_F(ReceiverFecTest, OldFecPacketDropped) { 350 TEST_F(ReceiverFecTest, OldFecPacketDropped) {
376 // 49 frames with 2 media packets and one FEC packet. All media packets 351 // 49 frames with 2 media packets and one FEC packet. All media packets
377 // missing. 352 // missing.
378 const unsigned int kNumMediaPackets = 49 * 2; 353 const unsigned int kNumMediaPackets = 49 * 2;
379 std::list<test::RawRtpPacket*> media_rtp_packets; 354 std::list<test::RawRtpPacket*> media_rtp_packets;
380 ForwardErrorCorrection::PacketList media_packets; 355 ForwardErrorCorrection::PacketList media_packets;
381 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { 356 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) {
382 std::list<test::RawRtpPacket*> frame_media_rtp_packets; 357 std::list<test::RawRtpPacket*> frame_media_rtp_packets;
383 ForwardErrorCorrection::PacketList frame_media_packets; 358 ForwardErrorCorrection::PacketList frame_media_packets;
384 ForwardErrorCorrection::PacketList fec_packets; 359 std::list<ForwardErrorCorrection::Packet*> fec_packets;
385 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); 360 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets);
386 GenerateFec(&frame_media_packets, &fec_packets, 1); 361 GenerateFec(&frame_media_packets, &fec_packets, 1);
387 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { 362 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) {
388 // Only FEC packets inserted. No packets recoverable at this time. 363 // Only FEC packets inserted. No packets recoverable at this time.
389 BuildAndAddRedFecPacket(*it); 364 BuildAndAddRedFecPacket(*it);
390 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 365 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
391 .Times(0); 366 .Times(0);
392 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 367 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
393 } 368 }
394 media_packets.insert(media_packets.end(), frame_media_packets.begin(), 369 // Move unique_ptr's to media_packets for lifetime management.
395 frame_media_packets.end()); 370 media_packets.insert(media_packets.end(),
371 std::make_move_iterator(frame_media_packets.begin()),
372 std::make_move_iterator(frame_media_packets.end()));
396 media_rtp_packets.insert(media_rtp_packets.end(), 373 media_rtp_packets.insert(media_rtp_packets.end(),
397 frame_media_rtp_packets.begin(), 374 frame_media_rtp_packets.begin(),
398 frame_media_rtp_packets.end()); 375 frame_media_rtp_packets.end());
399 } 376 }
400 // Insert the oldest media packet. The corresponding FEC packet is too old 377 // Insert the oldest media packet. The corresponding FEC packet is too old
401 // and should've been dropped. Only the media packet we inserted will be 378 // and should've been dropped. Only the media packet we inserted will be
402 // returned. 379 // returned.
403 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 380 BuildAndAddRedMediaPacket(media_rtp_packets.front());
404 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 381 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
405 .Times(1).WillRepeatedly(Return(true)); 382 .Times(1).WillRepeatedly(Return(true));
406 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 383 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
407
408 DeletePackets(&media_packets);
409 } 384 }
410 385
411 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, 386 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data,
412 size_t length, 387 size_t length,
413 uint8_t ulpfec_payload_type) { 388 uint8_t ulpfec_payload_type) {
414 webrtc::RTPHeader header; 389 webrtc::RTPHeader header;
415 std::unique_ptr<webrtc::RtpHeaderParser> parser( 390 std::unique_ptr<webrtc::RtpHeaderParser> parser(
416 webrtc::RtpHeaderParser::Create()); 391 webrtc::RtpHeaderParser::Create());
417 ASSERT_TRUE(parser->Parse(data, length, &header)); 392 ASSERT_TRUE(parser->Parse(data, length, &header));
418 393
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 0x27, 505 0x27,
531 0xc4, 506 0xc4,
532 0x2a, 507 0x2a,
533 0x21, 508 0x21,
534 0x2a, 509 0x2a,
535 0x28}; 510 0x28};
536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 511 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
537 } 512 }
538 513
539 } // namespace webrtc 514 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc ('k') | webrtc/modules/rtp_rtcp/source/forward_error_correction.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698