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

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

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

Powered by Google App Engine
This is Rietveld 408576698