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

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

Issue 2471073003: Make FlexfecReceiver a concrete class. (Closed)
Patch Set: Update fuzzer. 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) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 23 matching lines...) Expand all
34 34
35 constexpr size_t kPayloadLength = 500; 35 constexpr size_t kPayloadLength = 500;
36 constexpr uint32_t kFlexfecSsrc = 42984; 36 constexpr uint32_t kFlexfecSsrc = 42984;
37 constexpr uint32_t kMediaSsrc = 8353; 37 constexpr uint32_t kMediaSsrc = 8353;
38 38
39 } // namespace 39 } // namespace
40 40
41 class FlexfecReceiverTest : public ::testing::Test { 41 class FlexfecReceiverTest : public ::testing::Test {
42 protected: 42 protected:
43 FlexfecReceiverTest() 43 FlexfecReceiverTest()
44 : receiver_(FlexfecReceiver::Create(kFlexfecSsrc, 44 : receiver_(kFlexfecSsrc, kMediaSsrc, &recovered_packet_receiver_),
45 kMediaSsrc,
46 &recovered_packet_receiver_)),
47 erasure_code_(ForwardErrorCorrection::CreateFlexfec()), 45 erasure_code_(ForwardErrorCorrection::CreateFlexfec()),
48 packet_generator_(kMediaSsrc, kFlexfecSsrc) {} 46 packet_generator_(kMediaSsrc, kFlexfecSsrc) {}
49 47
50 // Generates |num_media_packets| corresponding to a single frame. 48 // Generates |num_media_packets| corresponding to a single frame.
51 void PacketizeFrame(size_t num_media_packets, 49 void PacketizeFrame(size_t num_media_packets,
52 size_t frame_offset, 50 size_t frame_offset,
53 PacketList* media_packets); 51 PacketList* media_packets);
54 52
55 // Generates |num_fec_packets| FEC packets, given |media_packets|. 53 // Generates |num_fec_packets| FEC packets, given |media_packets|.
56 std::list<Packet*> EncodeFec(const PacketList& media_packets, 54 std::list<Packet*> EncodeFec(const PacketList& media_packets,
57 size_t num_fec_packets); 55 size_t num_fec_packets);
58 56
59 std::unique_ptr<FlexfecReceiver> receiver_; 57 FlexfecReceiver receiver_;
60 std::unique_ptr<ForwardErrorCorrection> erasure_code_; 58 std::unique_ptr<ForwardErrorCorrection> erasure_code_;
61 59
62 FlexfecPacketGenerator packet_generator_; 60 FlexfecPacketGenerator packet_generator_;
63 testing::StrictMock<MockRecoveredPacketReceiver> recovered_packet_receiver_; 61 testing::StrictMock<MockRecoveredPacketReceiver> recovered_packet_receiver_;
64 }; 62 };
65 63
66 void FlexfecReceiverTest::PacketizeFrame(size_t num_media_packets, 64 void FlexfecReceiverTest::PacketizeFrame(size_t num_media_packets,
67 size_t frame_offset, 65 size_t frame_offset,
68 PacketList* media_packets) { 66 PacketList* media_packets) {
69 packet_generator_.NewFrame(num_media_packets); 67 packet_generator_.NewFrame(num_media_packets);
(...skipping 18 matching lines...) Expand all
88 kUseUnequalProtection, kFecMaskType, &fec_packets)); 86 kUseUnequalProtection, kFecMaskType, &fec_packets));
89 EXPECT_EQ(num_fec_packets, fec_packets.size()); 87 EXPECT_EQ(num_fec_packets, fec_packets.size());
90 return fec_packets; 88 return fec_packets;
91 } 89 }
92 90
93 TEST_F(FlexfecReceiverTest, ReceivesMediaPacket) { 91 TEST_F(FlexfecReceiverTest, ReceivesMediaPacket) {
94 packet_generator_.NewFrame(1); 92 packet_generator_.NewFrame(1);
95 std::unique_ptr<Packet> media_packet( 93 std::unique_ptr<Packet> media_packet(
96 packet_generator_.NextPacket(0, kPayloadLength)); 94 packet_generator_.NextPacket(0, kPayloadLength));
97 95
98 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 96 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
99 media_packet->length)); 97 media_packet->length));
100 } 98 }
101 99
102 TEST_F(FlexfecReceiverTest, FailsOnTruncatedMediaPacket) { 100 TEST_F(FlexfecReceiverTest, FailsOnTruncatedMediaPacket) {
103 const size_t kNoPayload = 0; 101 const size_t kNoPayload = 0;
104 102
105 packet_generator_.NewFrame(1); 103 packet_generator_.NewFrame(1);
106 std::unique_ptr<Packet> media_packet( 104 std::unique_ptr<Packet> media_packet(
107 packet_generator_.NextPacket(0, kNoPayload)); 105 packet_generator_.NextPacket(0, kNoPayload));
108 // Simulate truncated media packet. 106 // Simulate truncated media packet.
109 media_packet->length = kRtpHeaderSize - 1; 107 media_packet->length = kRtpHeaderSize - 1;
110 108
111 EXPECT_FALSE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 109 EXPECT_FALSE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
112 media_packet->length)); 110 media_packet->length));
113 } 111 }
114 112
115 TEST_F(FlexfecReceiverTest, ReceivesMediaAndFecPackets) { 113 TEST_F(FlexfecReceiverTest, ReceivesMediaAndFecPackets) {
116 const size_t kNumMediaPackets = 1; 114 const size_t kNumMediaPackets = 1;
117 const size_t kNumFecPackets = 1; 115 const size_t kNumFecPackets = 1;
118 116
119 PacketList media_packets; 117 PacketList media_packets;
120 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 118 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
121 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 119 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
122 auto media_packet = media_packets.front().get(); 120 auto media_packet = media_packets.front().get();
123 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front()); 121 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
124 122
125 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 123 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
126 media_packet->length)); 124 media_packet->length));
127 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(fec_packet->data, 125 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(fec_packet->data,
128 fec_packet->length)); 126 fec_packet->length));
129 } 127 }
130 128
131 TEST_F(FlexfecReceiverTest, FailsOnTruncatedFecPacket) { 129 TEST_F(FlexfecReceiverTest, FailsOnTruncatedFecPacket) {
132 const size_t kNumMediaPackets = 1; 130 const size_t kNumMediaPackets = 1;
133 const size_t kNumFecPackets = 1; 131 const size_t kNumFecPackets = 1;
134 132
135 PacketList media_packets; 133 PacketList media_packets;
136 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 134 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
137 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 135 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
138 auto media_packet = media_packets.front().get(); 136 auto media_packet = media_packets.front().get();
139 // Simulate truncated FlexFEC payload. 137 // Simulate truncated FlexFEC payload.
140 fec_packets.front()->length = 1; 138 fec_packets.front()->length = 1;
141 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front()); 139 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
142 140
143 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 141 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
144 media_packet->length)); 142 media_packet->length));
145 EXPECT_FALSE(receiver_->AddAndProcessReceivedPacket(fec_packet->data, 143 EXPECT_FALSE(receiver_.AddAndProcessReceivedPacket(fec_packet->data,
146 fec_packet->length)); 144 fec_packet->length));
147 } 145 }
148 146
149 TEST_F(FlexfecReceiverTest, FailsOnUnknownMediaSsrc) { 147 TEST_F(FlexfecReceiverTest, FailsOnUnknownMediaSsrc) {
150 const size_t kNumMediaPackets = 1; 148 const size_t kNumMediaPackets = 1;
151 149
152 PacketList media_packets; 150 PacketList media_packets;
153 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 151 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
154 auto media_packet = media_packets.front().get(); 152 auto media_packet = media_packets.front().get();
155 // Corrupt the SSRC. 153 // Corrupt the SSRC.
156 media_packet->data[8] = 0; 154 media_packet->data[8] = 0;
157 media_packet->data[9] = 1; 155 media_packet->data[9] = 1;
158 media_packet->data[10] = 2; 156 media_packet->data[10] = 2;
159 media_packet->data[11] = 3; 157 media_packet->data[11] = 3;
160 158
161 EXPECT_FALSE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 159 EXPECT_FALSE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
162 media_packet->length)); 160 media_packet->length));
163 } 161 }
164 162
165 TEST_F(FlexfecReceiverTest, FailsOnUnknownFecSsrc) { 163 TEST_F(FlexfecReceiverTest, FailsOnUnknownFecSsrc) {
166 const size_t kNumMediaPackets = 1; 164 const size_t kNumMediaPackets = 1;
167 const size_t kNumFecPackets = 1; 165 const size_t kNumFecPackets = 1;
168 166
169 PacketList media_packets; 167 PacketList media_packets;
170 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 168 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
171 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 169 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
172 auto media_packet = media_packets.front().get(); 170 auto media_packet = media_packets.front().get();
173 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front()); 171 auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
174 // Corrupt the SSRC. 172 // Corrupt the SSRC.
175 fec_packet->data[8] = 4; 173 fec_packet->data[8] = 4;
176 fec_packet->data[9] = 5; 174 fec_packet->data[9] = 5;
177 fec_packet->data[10] = 6; 175 fec_packet->data[10] = 6;
178 fec_packet->data[11] = 7; 176 fec_packet->data[11] = 7;
179 177
180 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 178 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
181 media_packet->length)); 179 media_packet->length));
182 EXPECT_FALSE(receiver_->AddAndProcessReceivedPacket(fec_packet->data, 180 EXPECT_FALSE(receiver_.AddAndProcessReceivedPacket(fec_packet->data,
183 fec_packet->length)); 181 fec_packet->length));
184 } 182 }
185 183
186 TEST_F(FlexfecReceiverTest, ReceivesMultiplePackets) { 184 TEST_F(FlexfecReceiverTest, ReceivesMultiplePackets) {
187 const size_t kNumMediaPackets = 2; 185 const size_t kNumMediaPackets = 2;
188 const size_t kNumFecPackets = 1; 186 const size_t kNumFecPackets = 1;
189 187
190 PacketList media_packets; 188 PacketList media_packets;
191 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 189 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
192 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 190 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
193 191
194 // Receive all media packets. 192 // Receive all media packets.
195 for (const auto& media_packet : media_packets) { 193 for (const auto& media_packet : media_packets) {
196 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket(media_packet->data, 194 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(media_packet->data,
197 media_packet->length)); 195 media_packet->length));
198 } 196 }
199 197
200 // Receive FEC packet. 198 // Receive FEC packet.
201 auto fec_packet = fec_packets.front(); 199 auto fec_packet = fec_packets.front();
202 std::unique_ptr<Packet> packet_with_rtp_header = 200 std::unique_ptr<Packet> packet_with_rtp_header =
203 packet_generator_.BuildFlexfecPacket(*fec_packet); 201 packet_generator_.BuildFlexfecPacket(*fec_packet);
204 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 202 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
205 packet_with_rtp_header->data, packet_with_rtp_header->length)); 203 packet_with_rtp_header->data, packet_with_rtp_header->length));
206 } 204 }
207 205
208 TEST_F(FlexfecReceiverTest, RecoversFromSingleMediaLoss) { 206 TEST_F(FlexfecReceiverTest, RecoversFromSingleMediaLoss) {
209 const size_t kNumMediaPackets = 2; 207 const size_t kNumMediaPackets = 2;
210 const size_t kNumFecPackets = 1; 208 const size_t kNumFecPackets = 1;
211 209
212 PacketList media_packets; 210 PacketList media_packets;
213 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 211 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
214 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 212 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
215 213
216 // Receive first media packet but drop second. 214 // Receive first media packet but drop second.
217 auto media_it = media_packets.begin(); 215 auto media_it = media_packets.begin();
218 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 216 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
219 (*media_it)->length)); 217 (*media_it)->length));
220 218
221 // Receive FEC packet and ensure recovery of lost media packet. 219 // Receive FEC packet and ensure recovery of lost media packet.
222 auto fec_it = fec_packets.begin(); 220 auto fec_it = fec_packets.begin();
223 std::unique_ptr<Packet> packet_with_rtp_header = 221 std::unique_ptr<Packet> packet_with_rtp_header =
224 packet_generator_.BuildFlexfecPacket(**fec_it); 222 packet_generator_.BuildFlexfecPacket(**fec_it);
225 media_it++; 223 media_it++;
226 EXPECT_CALL(recovered_packet_receiver_, 224 EXPECT_CALL(recovered_packet_receiver_,
227 OnRecoveredPacket(_, (*media_it)->length)) 225 OnRecoveredPacket(_, (*media_it)->length))
228 .With( 226 .With(
229 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 227 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
230 .WillOnce(Return(true)); 228 .WillOnce(Return(true));
231 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 229 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
232 packet_with_rtp_header->data, packet_with_rtp_header->length)); 230 packet_with_rtp_header->data, packet_with_rtp_header->length));
233 } 231 }
234 232
235 TEST_F(FlexfecReceiverTest, RecoversFromDoubleMediaLoss) { 233 TEST_F(FlexfecReceiverTest, RecoversFromDoubleMediaLoss) {
236 const size_t kNumMediaPackets = 2; 234 const size_t kNumMediaPackets = 2;
237 const size_t kNumFecPackets = 2; 235 const size_t kNumFecPackets = 2;
238 236
239 PacketList media_packets; 237 PacketList media_packets;
240 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 238 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
241 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 239 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
242 240
243 // Drop both media packets. 241 // Drop both media packets.
244 242
245 // Receive first FEC packet and recover first lost media packet. 243 // Receive first FEC packet and recover first lost media packet.
246 auto fec_it = fec_packets.begin(); 244 auto fec_it = fec_packets.begin();
247 std::unique_ptr<Packet> packet_with_rtp_header = 245 std::unique_ptr<Packet> packet_with_rtp_header =
248 packet_generator_.BuildFlexfecPacket(**fec_it); 246 packet_generator_.BuildFlexfecPacket(**fec_it);
249 auto media_it = media_packets.begin(); 247 auto media_it = media_packets.begin();
250 EXPECT_CALL(recovered_packet_receiver_, 248 EXPECT_CALL(recovered_packet_receiver_,
251 OnRecoveredPacket(_, (*media_it)->length)) 249 OnRecoveredPacket(_, (*media_it)->length))
252 .With( 250 .With(
253 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 251 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
254 .WillOnce(Return(true)); 252 .WillOnce(Return(true));
255 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 253 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
256 packet_with_rtp_header->data, packet_with_rtp_header->length)); 254 packet_with_rtp_header->data, packet_with_rtp_header->length));
257 255
258 // Receive second FEC packet and recover second lost media packet. 256 // Receive second FEC packet and recover second lost media packet.
259 fec_it++; 257 fec_it++;
260 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); 258 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it);
261 media_it++; 259 media_it++;
262 EXPECT_CALL(recovered_packet_receiver_, 260 EXPECT_CALL(recovered_packet_receiver_,
263 OnRecoveredPacket(_, (*media_it)->length)) 261 OnRecoveredPacket(_, (*media_it)->length))
264 .With( 262 .With(
265 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 263 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
266 .WillOnce(Return(true)); 264 .WillOnce(Return(true));
267 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 265 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
268 packet_with_rtp_header->data, packet_with_rtp_header->length)); 266 packet_with_rtp_header->data, packet_with_rtp_header->length));
269 } 267 }
270 268
271 TEST_F(FlexfecReceiverTest, DoesNotRecoverFromMediaAndFecLoss) { 269 TEST_F(FlexfecReceiverTest, DoesNotRecoverFromMediaAndFecLoss) {
272 const size_t kNumMediaPackets = 2; 270 const size_t kNumMediaPackets = 2;
273 const size_t kNumFecPackets = 1; 271 const size_t kNumFecPackets = 1;
274 272
275 PacketList media_packets; 273 PacketList media_packets;
276 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 274 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
277 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 275 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
278 276
279 // Receive first media packet. 277 // Receive first media packet.
280 auto media_it = media_packets.begin(); 278 auto media_it = media_packets.begin();
281 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 279 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
282 (*media_it)->length)); 280 (*media_it)->length));
283 281
284 // Drop second media packet and FEC packet. Do not expect call back. 282 // Drop second media packet and FEC packet. Do not expect call back.
285 } 283 }
286 284
287 TEST_F(FlexfecReceiverTest, DoesNotCallbackTwice) { 285 TEST_F(FlexfecReceiverTest, DoesNotCallbackTwice) {
288 const size_t kNumMediaPackets = 2; 286 const size_t kNumMediaPackets = 2;
289 const size_t kNumFecPackets = 1; 287 const size_t kNumFecPackets = 1;
290 288
291 PacketList media_packets; 289 PacketList media_packets;
292 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 290 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
293 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 291 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
294 292
295 // Receive first media packet but drop second. 293 // Receive first media packet but drop second.
296 auto media_it = media_packets.begin(); 294 auto media_it = media_packets.begin();
297 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 295 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
298 (*media_it)->length)); 296 (*media_it)->length));
299 297
300 // Receive FEC packet and ensure recovery of lost media packet. 298 // Receive FEC packet and ensure recovery of lost media packet.
301 auto fec_it = fec_packets.begin(); 299 auto fec_it = fec_packets.begin();
302 std::unique_ptr<Packet> packet_with_rtp_header = 300 std::unique_ptr<Packet> packet_with_rtp_header =
303 packet_generator_.BuildFlexfecPacket(**fec_it); 301 packet_generator_.BuildFlexfecPacket(**fec_it);
304 media_it++; 302 media_it++;
305 EXPECT_CALL(recovered_packet_receiver_, 303 EXPECT_CALL(recovered_packet_receiver_,
306 OnRecoveredPacket(_, (*media_it)->length)) 304 OnRecoveredPacket(_, (*media_it)->length))
307 .With( 305 .With(
308 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 306 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
309 .WillOnce(Return(true)); 307 .WillOnce(Return(true));
310 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 308 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
311 packet_with_rtp_header->data, packet_with_rtp_header->length)); 309 packet_with_rtp_header->data, packet_with_rtp_header->length));
312 310
313 // Receive FEC packet again. 311 // Receive FEC packet again.
314 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 312 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
315 packet_with_rtp_header->data, packet_with_rtp_header->length)); 313 packet_with_rtp_header->data, packet_with_rtp_header->length));
316 314
317 // Do not call back again. 315 // Do not call back again.
318 } 316 }
319 317
320 // Here we are implicitly assuming packet masks that are suitable for 318 // Here we are implicitly assuming packet masks that are suitable for
321 // this type of 50% correlated loss. If we are changing our precomputed 319 // this type of 50% correlated loss. If we are changing our precomputed
322 // packet masks, this test might need to be updated. 320 // packet masks, this test might need to be updated.
323 TEST_F(FlexfecReceiverTest, RecoversFrom50PercentLoss) { 321 TEST_F(FlexfecReceiverTest, RecoversFrom50PercentLoss) {
324 const size_t kNumFecPackets = 5; 322 const size_t kNumFecPackets = 5;
325 const size_t kNumFrames = 2 * kNumFecPackets; 323 const size_t kNumFrames = 2 * kNumFecPackets;
326 const size_t kNumMediaPacketsPerFrame = 1; 324 const size_t kNumMediaPacketsPerFrame = 1;
327 325
328 PacketList media_packets; 326 PacketList media_packets;
329 for (size_t i = 0; i < kNumFrames; ++i) { 327 for (size_t i = 0; i < kNumFrames; ++i) {
330 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets); 328 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
331 } 329 }
332 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 330 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
333 331
334 // Drop every second media packet. 332 // Drop every second media packet.
335 auto media_it = media_packets.begin(); 333 auto media_it = media_packets.begin();
336 while (media_it != media_packets.end()) { 334 while (media_it != media_packets.end()) {
337 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 335 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
338 (*media_it)->length)); 336 (*media_it)->length));
339 ++media_it; 337 ++media_it;
340 if (media_it == media_packets.end()) { 338 if (media_it == media_packets.end()) {
341 break; 339 break;
342 } 340 }
343 ++media_it; 341 ++media_it;
344 } 342 }
345 343
346 // Receive all FEC packets. 344 // Receive all FEC packets.
347 media_it = media_packets.begin(); 345 media_it = media_packets.begin();
348 for (const auto& fec_packet : fec_packets) { 346 for (const auto& fec_packet : fec_packets) {
349 std::unique_ptr<Packet> fec_packet_with_rtp_header = 347 std::unique_ptr<Packet> fec_packet_with_rtp_header =
350 packet_generator_.BuildFlexfecPacket(*fec_packet); 348 packet_generator_.BuildFlexfecPacket(*fec_packet);
351 ++media_it; 349 ++media_it;
352 if (media_it == media_packets.end()) { 350 if (media_it == media_packets.end()) {
353 break; 351 break;
354 } 352 }
355 EXPECT_CALL(recovered_packet_receiver_, 353 EXPECT_CALL(recovered_packet_receiver_,
356 OnRecoveredPacket(_, (*media_it)->length)) 354 OnRecoveredPacket(_, (*media_it)->length))
357 .With(Args<0, 1>( 355 .With(Args<0, 1>(
358 ElementsAreArray((*media_it)->data, (*media_it)->length))) 356 ElementsAreArray((*media_it)->data, (*media_it)->length)))
359 .WillOnce(Return(true)); 357 .WillOnce(Return(true));
360 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 358 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
361 fec_packet_with_rtp_header->data, fec_packet_with_rtp_header->length)); 359 fec_packet_with_rtp_header->data, fec_packet_with_rtp_header->length));
362 ++media_it; 360 ++media_it;
363 } 361 }
364 } 362 }
365 363
366 TEST_F(FlexfecReceiverTest, DelayedFecPacketDoesHelp) { 364 TEST_F(FlexfecReceiverTest, DelayedFecPacketDoesHelp) {
367 // These values need to be updated if the underlying erasure code 365 // These values need to be updated if the underlying erasure code
368 // implementation changes. 366 // implementation changes.
369 const size_t kNumFrames = 48; 367 const size_t kNumFrames = 48;
370 const size_t kNumMediaPacketsPerFrame = 1; 368 const size_t kNumMediaPacketsPerFrame = 1;
371 const size_t kNumFecPackets = 1; 369 const size_t kNumFecPackets = 1;
372 370
373 PacketList media_packets; 371 PacketList media_packets;
374 PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets); 372 PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets);
375 PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets); 373 PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets);
376 // Protect two first frames. 374 // Protect two first frames.
377 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 375 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
378 for (size_t i = 2; i < kNumFrames; ++i) { 376 for (size_t i = 2; i < kNumFrames; ++i) {
379 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets); 377 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
380 } 378 }
381 379
382 // Drop first media packet and delay FEC packet. 380 // Drop first media packet and delay FEC packet.
383 auto media_it = media_packets.begin(); 381 auto media_it = media_packets.begin();
384 ++media_it; 382 ++media_it;
385 383
386 // Receive all other media packets. 384 // Receive all other media packets.
387 while (media_it != media_packets.end()) { 385 while (media_it != media_packets.end()) {
388 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 386 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
389 (*media_it)->length)); 387 (*media_it)->length));
390 ++media_it; 388 ++media_it;
391 } 389 }
392 390
393 // Receive FEC packet and recover first media packet. 391 // Receive FEC packet and recover first media packet.
394 auto fec_it = fec_packets.begin(); 392 auto fec_it = fec_packets.begin();
395 std::unique_ptr<Packet> packet_with_rtp_header = 393 std::unique_ptr<Packet> packet_with_rtp_header =
396 packet_generator_.BuildFlexfecPacket(**fec_it); 394 packet_generator_.BuildFlexfecPacket(**fec_it);
397 media_it = media_packets.begin(); 395 media_it = media_packets.begin();
398 EXPECT_CALL(recovered_packet_receiver_, 396 EXPECT_CALL(recovered_packet_receiver_,
399 OnRecoveredPacket(_, (*media_it)->length)) 397 OnRecoveredPacket(_, (*media_it)->length))
400 .With( 398 .With(
401 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 399 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
402 .WillOnce(Return(true)); 400 .WillOnce(Return(true));
403 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 401 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
404 packet_with_rtp_header->data, packet_with_rtp_header->length)); 402 packet_with_rtp_header->data, packet_with_rtp_header->length));
405 } 403 }
406 404
407 TEST_F(FlexfecReceiverTest, TooDelayedFecPacketDoesNotHelp) { 405 TEST_F(FlexfecReceiverTest, TooDelayedFecPacketDoesNotHelp) {
408 // These values need to be updated if the underlying erasure code 406 // These values need to be updated if the underlying erasure code
409 // implementation changes. 407 // implementation changes.
410 const size_t kNumFrames = 49; 408 const size_t kNumFrames = 49;
411 const size_t kNumMediaPacketsPerFrame = 1; 409 const size_t kNumMediaPacketsPerFrame = 1;
412 const size_t kNumFecPackets = 1; 410 const size_t kNumFecPackets = 1;
413 411
414 PacketList media_packets; 412 PacketList media_packets;
415 PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets); 413 PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets);
416 PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets); 414 PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets);
417 // Protect two first frames. 415 // Protect two first frames.
418 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 416 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
419 for (size_t i = 2; i < kNumFrames; ++i) { 417 for (size_t i = 2; i < kNumFrames; ++i) {
420 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets); 418 PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
421 } 419 }
422 420
423 // Drop first media packet and delay FEC packet. 421 // Drop first media packet and delay FEC packet.
424 auto media_it = media_packets.begin(); 422 auto media_it = media_packets.begin();
425 ++media_it; 423 ++media_it;
426 424
427 // Receive all other media packets. 425 // Receive all other media packets.
428 while (media_it != media_packets.end()) { 426 while (media_it != media_packets.end()) {
429 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 427 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
430 (*media_it)->length)); 428 (*media_it)->length));
431 ++media_it; 429 ++media_it;
432 } 430 }
433 431
434 // Receive FEC packet. 432 // Receive FEC packet.
435 auto fec_it = fec_packets.begin(); 433 auto fec_it = fec_packets.begin();
436 std::unique_ptr<Packet> packet_with_rtp_header = 434 std::unique_ptr<Packet> packet_with_rtp_header =
437 packet_generator_.BuildFlexfecPacket(**fec_it); 435 packet_generator_.BuildFlexfecPacket(**fec_it);
438 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 436 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
439 packet_with_rtp_header->data, packet_with_rtp_header->length)); 437 packet_with_rtp_header->data, packet_with_rtp_header->length));
440 438
441 // Do not expect a call back. 439 // Do not expect a call back.
442 } 440 }
443 441
444 TEST_F(FlexfecReceiverTest, RecoversWithMediaPacketsOutOfOrder) { 442 TEST_F(FlexfecReceiverTest, RecoversWithMediaPacketsOutOfOrder) {
445 const size_t kNumMediaPackets = 6; 443 const size_t kNumMediaPackets = 6;
446 const size_t kNumFecPackets = 2; 444 const size_t kNumFecPackets = 2;
447 445
448 PacketList media_packets; 446 PacketList media_packets;
449 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 447 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
450 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 448 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
451 449
452 // Lose two media packets, and receive the others out of order. 450 // Lose two media packets, and receive the others out of order.
453 auto media_it = media_packets.begin(); 451 auto media_it = media_packets.begin();
454 auto media_packet0 = media_it++; 452 auto media_packet0 = media_it++;
455 auto media_packet1 = media_it++; 453 auto media_packet1 = media_it++;
456 auto media_packet2 = media_it++; 454 auto media_packet2 = media_it++;
457 auto media_packet3 = media_it++; 455 auto media_packet3 = media_it++;
458 auto media_packet4 = media_it++; 456 auto media_packet4 = media_it++;
459 auto media_packet5 = media_it++; 457 auto media_packet5 = media_it++;
460 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_packet5)->data, 458 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_packet5)->data,
461 (*media_packet5)->length)); 459 (*media_packet5)->length));
462 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_packet2)->data, 460 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_packet2)->data,
463 (*media_packet2)->length)); 461 (*media_packet2)->length));
464 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_packet3)->data, 462 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_packet3)->data,
465 (*media_packet3)->length)); 463 (*media_packet3)->length));
466 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_packet0)->data, 464 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_packet0)->data,
467 (*media_packet0)->length)); 465 (*media_packet0)->length));
468 466
469 // Expect to recover lost media packets. 467 // Expect to recover lost media packets.
470 EXPECT_CALL(recovered_packet_receiver_, 468 EXPECT_CALL(recovered_packet_receiver_,
471 OnRecoveredPacket(_, (*media_packet1)->length)) 469 OnRecoveredPacket(_, (*media_packet1)->length))
472 .With(Args<0, 1>( 470 .With(Args<0, 1>(
473 ElementsAreArray((*media_packet1)->data, (*media_packet1)->length))) 471 ElementsAreArray((*media_packet1)->data, (*media_packet1)->length)))
474 .WillOnce(Return(true)); 472 .WillOnce(Return(true));
475 EXPECT_CALL(recovered_packet_receiver_, 473 EXPECT_CALL(recovered_packet_receiver_,
476 OnRecoveredPacket(_, (*media_packet4)->length)) 474 OnRecoveredPacket(_, (*media_packet4)->length))
477 .With(Args<0, 1>( 475 .With(Args<0, 1>(
478 ElementsAreArray((*media_packet4)->data, (*media_packet4)->length))) 476 ElementsAreArray((*media_packet4)->data, (*media_packet4)->length)))
479 .WillOnce(Return(true)); 477 .WillOnce(Return(true));
480 478
481 // Add FEC packets. 479 // Add FEC packets.
482 auto fec_it = fec_packets.begin(); 480 auto fec_it = fec_packets.begin();
483 std::unique_ptr<Packet> packet_with_rtp_header; 481 std::unique_ptr<Packet> packet_with_rtp_header;
484 while (fec_it != fec_packets.end()) { 482 while (fec_it != fec_packets.end()) {
485 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it); 483 packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it);
486 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 484 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
487 packet_with_rtp_header->data, packet_with_rtp_header->length)); 485 packet_with_rtp_header->data, packet_with_rtp_header->length));
488 ++fec_it; 486 ++fec_it;
489 } 487 }
490 } 488 }
491 489
492 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) { 490 TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) {
493 const size_t kNumMediaPackets = 2; 491 const size_t kNumMediaPackets = 2;
494 const size_t kNumFecPackets = 1; 492 const size_t kNumFecPackets = 1;
495 493
496 PacketList media_packets; 494 PacketList media_packets;
497 PacketizeFrame(kNumMediaPackets, 0, &media_packets); 495 PacketizeFrame(kNumMediaPackets, 0, &media_packets);
498 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets); 496 std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
499 497
500 // Receive first media packet but drop second. 498 // Receive first media packet but drop second.
501 auto media_it = media_packets.begin(); 499 auto media_it = media_packets.begin();
502 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket((*media_it)->data, 500 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket((*media_it)->data,
503 (*media_it)->length)); 501 (*media_it)->length));
504 502
505 // Receive FEC packet and ensure recovery of lost media packet. 503 // Receive FEC packet and ensure recovery of lost media packet.
506 auto fec_it = fec_packets.begin(); 504 auto fec_it = fec_packets.begin();
507 std::unique_ptr<Packet> packet_with_rtp_header = 505 std::unique_ptr<Packet> packet_with_rtp_header =
508 packet_generator_.BuildFlexfecPacket(**fec_it); 506 packet_generator_.BuildFlexfecPacket(**fec_it);
509 media_it++; 507 media_it++;
510 EXPECT_CALL(recovered_packet_receiver_, 508 EXPECT_CALL(recovered_packet_receiver_,
511 OnRecoveredPacket(_, (*media_it)->length)) 509 OnRecoveredPacket(_, (*media_it)->length))
512 .With( 510 .With(
513 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length))) 511 Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)))
514 .WillOnce(Return(true)); 512 .WillOnce(Return(true));
515 EXPECT_TRUE(receiver_->AddAndProcessReceivedPacket( 513 EXPECT_TRUE(receiver_.AddAndProcessReceivedPacket(
516 packet_with_rtp_header->data, packet_with_rtp_header->length)); 514 packet_with_rtp_header->data, packet_with_rtp_header->length));
517 515
518 // Check stats calculations. 516 // Check stats calculations.
519 FecPacketCounter packet_counter = receiver_->GetPacketCounter(); 517 FecPacketCounter packet_counter = receiver_.GetPacketCounter();
520 EXPECT_EQ(2U, packet_counter.num_packets); 518 EXPECT_EQ(2U, packet_counter.num_packets);
521 EXPECT_EQ(1U, packet_counter.num_fec_packets); 519 EXPECT_EQ(1U, packet_counter.num_fec_packets);
522 EXPECT_EQ(1U, packet_counter.num_recovered_packets); 520 EXPECT_EQ(1U, packet_counter.num_recovered_packets);
523 } 521 }
524 522
525 } // namespace webrtc 523 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/flexfec_receiver_impl.cc ('k') | webrtc/test/fuzzers/flexfec_receiver_fuzzer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698