OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |