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 |
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(nullptr); |
| 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 Loading... |
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 |
OLD | NEW |