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

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

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

Powered by Google App Engine
This is Rietveld 408576698