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

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

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

Powered by Google App Engine
This is Rietveld 408576698