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