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