OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 21 matching lines...) Expand all Loading... | |
32 | 32 |
33 class ReceiverFecTest : public ::testing::Test { | 33 class ReceiverFecTest : public ::testing::Test { |
34 protected: | 34 protected: |
35 virtual void SetUp() { | 35 virtual void SetUp() { |
36 fec_.reset(new ForwardErrorCorrection()); | 36 fec_.reset(new ForwardErrorCorrection()); |
37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); | 37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); |
38 generator_.reset(new FrameGenerator()); | 38 generator_.reset(new FrameGenerator()); |
39 } | 39 } |
40 | 40 |
41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets, | 41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets, |
42 ForwardErrorCorrection::PacketList* fec_packets, | 42 std::list<ForwardErrorCorrection::Packet*>* fec_packets, |
43 unsigned int num_fec_packets) { | 43 unsigned int num_fec_packets) { |
44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); | 44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); |
45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor, | 45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor, |
46 0, false, kFecMaskBursty, fec_packets)); | 46 0, false, kFecMaskBursty, fec_packets)); |
47 ASSERT_EQ(num_fec_packets, fec_packets->size()); | 47 ASSERT_EQ(num_fec_packets, fec_packets->size()); |
48 } | 48 } |
49 | 49 |
50 void GenerateFrame(int num_media_packets, | 50 void GenerateFrame(int num_media_packets, |
51 int frame_offset, | 51 int frame_offset, |
52 std::list<test::RawRtpPacket*>* media_rtp_packets, | 52 std::list<test::RawRtpPacket*>* media_rtp_packets, |
53 ForwardErrorCorrection::PacketList* media_packets) { | 53 ForwardErrorCorrection::PacketList* media_packets) { |
54 generator_->NewFrame(num_media_packets); | 54 generator_->NewFrame(num_media_packets); |
55 for (int i = 0; i < num_media_packets; ++i) { | 55 for (int i = 0; i < num_media_packets; ++i) { |
56 media_rtp_packets->push_back( | 56 media_rtp_packets->push_back( |
57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); | 57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); |
58 media_packets->push_back(media_rtp_packets->back()); | 58 media_packets->push_back( |
59 std::unique_ptr<ForwardErrorCorrection::Packet>( | |
stefan-webrtc
2016/07/20 09:50:35
Should we std::move here too?
brandtr
2016/07/21 09:04:20
I changed to emplace_back.
The RawRtpPackets are
| |
60 media_rtp_packets->back())); | |
59 } | 61 } |
60 } | 62 } |
61 | 63 |
62 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, | 64 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, |
63 int times) { | 65 int times) { |
64 // Verify that the content of the reconstructed packet is equal to the | 66 // Verify that the content of the reconstructed packet is equal to the |
65 // content of |packet|, and that the same content is received |times| number | 67 // content of |packet|, and that the same content is received |times| number |
66 // of times in a row. | 68 // of times in a row. |
67 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) | 69 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) |
68 .With(Args<0, 1>(ElementsAreArray(packet->data, | 70 .With(Args<0, 1>(ElementsAreArray(packet->data, |
(...skipping 21 matching lines...) Expand all Loading... | |
90 static void SurvivesMaliciousPacket(const uint8_t* data, | 92 static void SurvivesMaliciousPacket(const uint8_t* data, |
91 size_t length, | 93 size_t length, |
92 uint8_t ulpfec_payload_type); | 94 uint8_t ulpfec_payload_type); |
93 | 95 |
94 MockRtpData rtp_data_callback_; | 96 MockRtpData rtp_data_callback_; |
95 std::unique_ptr<ForwardErrorCorrection> fec_; | 97 std::unique_ptr<ForwardErrorCorrection> fec_; |
96 std::unique_ptr<FecReceiver> receiver_fec_; | 98 std::unique_ptr<FecReceiver> receiver_fec_; |
97 std::unique_ptr<FrameGenerator> generator_; | 99 std::unique_ptr<FrameGenerator> generator_; |
98 }; | 100 }; |
99 | 101 |
100 void DeletePackets(ForwardErrorCorrection::PacketList* packets) { | |
101 while (!packets->empty()) { | |
102 delete packets->front(); | |
103 packets->pop_front(); | |
104 } | |
105 } | |
106 | |
107 TEST_F(ReceiverFecTest, TwoMediaOneFec) { | 102 TEST_F(ReceiverFecTest, TwoMediaOneFec) { |
108 const unsigned int kNumFecPackets = 1u; | 103 const unsigned int kNumFecPackets = 1u; |
109 std::list<test::RawRtpPacket*> media_rtp_packets; | 104 std::list<test::RawRtpPacket*> media_rtp_packets; |
110 ForwardErrorCorrection::PacketList media_packets; | 105 ForwardErrorCorrection::PacketList media_packets; |
111 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 106 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
112 ForwardErrorCorrection::PacketList fec_packets; | 107 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
113 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 108 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
114 | 109 |
115 // Recovery | 110 // Recovery |
116 auto it = media_rtp_packets.begin(); | 111 auto it = media_rtp_packets.begin(); |
117 BuildAndAddRedMediaPacket(*it); | 112 BuildAndAddRedMediaPacket(*it); |
118 VerifyReconstructedMediaPacket(*it, 1); | 113 VerifyReconstructedMediaPacket(*it, 1); |
119 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 114 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
120 // Drop one media packet. | 115 // Drop one media packet. |
121 auto fec_it = fec_packets.begin(); | 116 auto fec_it = fec_packets.begin(); |
122 BuildAndAddRedFecPacket(*fec_it); | 117 BuildAndAddRedFecPacket(*fec_it); |
123 ++it; | 118 ++it; |
124 VerifyReconstructedMediaPacket(*it, 1); | 119 VerifyReconstructedMediaPacket(*it, 1); |
125 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 120 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
126 | 121 |
127 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 122 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
128 EXPECT_EQ(2U, counter.num_packets); | 123 EXPECT_EQ(2U, counter.num_packets); |
129 EXPECT_EQ(1U, counter.num_fec_packets); | 124 EXPECT_EQ(1U, counter.num_fec_packets); |
130 EXPECT_EQ(1U, counter.num_recovered_packets); | 125 EXPECT_EQ(1U, counter.num_recovered_packets); |
131 | |
132 DeletePackets(&media_packets); | |
133 } | 126 } |
134 | 127 |
135 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { | 128 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { |
136 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 129 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
137 .WillRepeatedly(Return(true)); | 130 .WillRepeatedly(Return(true)); |
138 | 131 |
139 const unsigned int kNumFecPackets = 1u; | 132 const unsigned int kNumFecPackets = 1u; |
140 std::list<test::RawRtpPacket*> media_rtp_packets; | 133 std::list<test::RawRtpPacket*> media_rtp_packets; |
141 ForwardErrorCorrection::PacketList media_packets; | 134 ForwardErrorCorrection::PacketList media_packets; |
142 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 135 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
143 ForwardErrorCorrection::PacketList fec_packets; | 136 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
144 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 137 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
145 ByteWriter<uint16_t>::WriteBigEndian( | 138 ByteWriter<uint16_t>::WriteBigEndian( |
146 &fec_packets.front()->data[fec_garbage_offset], 0x4711); | 139 &fec_packets.front()->data[fec_garbage_offset], 0x4711); |
147 | 140 |
148 // Inject first media packet, then first FEC packet, skipping the second media | 141 // Inject first media packet, then first FEC packet, skipping the second media |
149 // packet to cause a recovery from the FEC packet. | 142 // packet to cause a recovery from the FEC packet. |
150 BuildAndAddRedMediaPacket(media_rtp_packets.front()); | 143 BuildAndAddRedMediaPacket(media_rtp_packets.front()); |
151 BuildAndAddRedFecPacket(fec_packets.front()); | 144 BuildAndAddRedFecPacket(fec_packets.front()); |
152 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 145 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
153 | 146 |
154 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 147 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
155 EXPECT_EQ(2u, counter.num_packets); | 148 EXPECT_EQ(2u, counter.num_packets); |
156 EXPECT_EQ(1u, counter.num_fec_packets); | 149 EXPECT_EQ(1u, counter.num_fec_packets); |
157 EXPECT_EQ(0u, counter.num_recovered_packets); | 150 EXPECT_EQ(0u, counter.num_recovered_packets); |
158 | |
159 DeletePackets(&media_packets); | |
160 } | 151 } |
161 | 152 |
162 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { | 153 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { |
163 // Byte offset 8 is the 'length recovery' field of the FEC header. | 154 // Byte offset 8 is the 'length recovery' field of the FEC header. |
164 InjectGarbagePacketLength(8); | 155 InjectGarbagePacketLength(8); |
165 } | 156 } |
166 | 157 |
167 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { | 158 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { |
168 // Byte offset 10 is the 'protection length' field in the first FEC level | 159 // Byte offset 10 is the 'protection length' field in the first FEC level |
169 // header. | 160 // header. |
170 InjectGarbagePacketLength(10); | 161 InjectGarbagePacketLength(10); |
171 } | 162 } |
172 | 163 |
173 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { | 164 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { |
174 const unsigned int kNumFecPackets = 2u; | 165 const unsigned int kNumFecPackets = 2u; |
175 std::list<test::RawRtpPacket*> media_rtp_packets; | 166 std::list<test::RawRtpPacket*> media_rtp_packets; |
176 ForwardErrorCorrection::PacketList media_packets; | 167 ForwardErrorCorrection::PacketList media_packets; |
177 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 168 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
178 ForwardErrorCorrection::PacketList fec_packets; | 169 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
179 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 170 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
180 | 171 |
181 // Recovery | 172 // Recovery |
182 // Drop both media packets. | 173 // Drop both media packets. |
183 auto it = media_rtp_packets.begin(); | 174 auto it = media_rtp_packets.begin(); |
184 auto fec_it = fec_packets.begin(); | 175 auto fec_it = fec_packets.begin(); |
185 BuildAndAddRedFecPacket(*fec_it); | 176 BuildAndAddRedFecPacket(*fec_it); |
186 VerifyReconstructedMediaPacket(*it, 1); | 177 VerifyReconstructedMediaPacket(*it, 1); |
187 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 178 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
188 ++fec_it; | 179 ++fec_it; |
189 BuildAndAddRedFecPacket(*fec_it); | 180 BuildAndAddRedFecPacket(*fec_it); |
190 ++it; | 181 ++it; |
191 VerifyReconstructedMediaPacket(*it, 1); | 182 VerifyReconstructedMediaPacket(*it, 1); |
192 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 183 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
193 | |
194 DeletePackets(&media_packets); | |
195 } | 184 } |
196 | 185 |
197 TEST_F(ReceiverFecTest, TwoFramesOneFec) { | 186 TEST_F(ReceiverFecTest, TwoFramesOneFec) { |
198 const unsigned int kNumFecPackets = 1u; | 187 const unsigned int kNumFecPackets = 1u; |
199 std::list<test::RawRtpPacket*> media_rtp_packets; | 188 std::list<test::RawRtpPacket*> media_rtp_packets; |
200 ForwardErrorCorrection::PacketList media_packets; | 189 ForwardErrorCorrection::PacketList media_packets; |
201 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); | 190 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); |
202 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); | 191 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); |
203 ForwardErrorCorrection::PacketList fec_packets; | 192 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
204 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 193 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
205 | 194 |
206 // Recovery | 195 // Recovery |
207 auto it = media_rtp_packets.begin(); | 196 auto it = media_rtp_packets.begin(); |
208 BuildAndAddRedMediaPacket(media_rtp_packets.front()); | 197 BuildAndAddRedMediaPacket(media_rtp_packets.front()); |
209 VerifyReconstructedMediaPacket(*it, 1); | 198 VerifyReconstructedMediaPacket(*it, 1); |
210 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 199 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
211 // Drop one media packet. | 200 // Drop one media packet. |
212 BuildAndAddRedFecPacket(fec_packets.front()); | 201 BuildAndAddRedFecPacket(fec_packets.front()); |
213 ++it; | 202 ++it; |
214 VerifyReconstructedMediaPacket(*it, 1); | 203 VerifyReconstructedMediaPacket(*it, 1); |
215 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 204 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
216 | |
217 DeletePackets(&media_packets); | |
218 } | 205 } |
219 | 206 |
220 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { | 207 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { |
221 const unsigned int kNumFecPackets = 1u; | 208 const unsigned int kNumFecPackets = 1u; |
222 std::list<test::RawRtpPacket*> media_rtp_packets; | 209 std::list<test::RawRtpPacket*> media_rtp_packets; |
223 ForwardErrorCorrection::PacketList media_packets; | 210 ForwardErrorCorrection::PacketList media_packets; |
224 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); | 211 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); |
225 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); | 212 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); |
226 | 213 |
227 ForwardErrorCorrection::PacketList fec_packets; | 214 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
228 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 215 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
229 | 216 |
230 // Recovery | 217 // Recovery |
231 auto it = media_rtp_packets.begin(); | 218 auto it = media_rtp_packets.begin(); |
232 BuildAndAddRedMediaPacket(*it); // First frame: one packet. | 219 BuildAndAddRedMediaPacket(*it); // First frame: one packet. |
233 VerifyReconstructedMediaPacket(*it, 1); | 220 VerifyReconstructedMediaPacket(*it, 1); |
234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 221 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
235 ++it; | 222 ++it; |
236 BuildAndAddRedMediaPacket(*it); // First packet of second frame. | 223 BuildAndAddRedMediaPacket(*it); // First packet of second frame. |
237 VerifyReconstructedMediaPacket(*it, 1); | 224 VerifyReconstructedMediaPacket(*it, 1); |
238 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 225 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
239 | |
240 DeletePackets(&media_packets); | |
241 } | 226 } |
242 | 227 |
243 TEST_F(ReceiverFecTest, MaxFramesOneFec) { | 228 TEST_F(ReceiverFecTest, MaxFramesOneFec) { |
244 const unsigned int kNumFecPackets = 1u; | 229 const unsigned int kNumFecPackets = 1u; |
245 const unsigned int kNumMediaPackets = 48u; | 230 const unsigned int kNumMediaPackets = 48u; |
246 std::list<test::RawRtpPacket*> media_rtp_packets; | 231 std::list<test::RawRtpPacket*> media_rtp_packets; |
247 ForwardErrorCorrection::PacketList media_packets; | 232 ForwardErrorCorrection::PacketList media_packets; |
248 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { | 233 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { |
249 GenerateFrame(1, i, &media_rtp_packets, &media_packets); | 234 GenerateFrame(1, i, &media_rtp_packets, &media_packets); |
250 } | 235 } |
251 ForwardErrorCorrection::PacketList fec_packets; | 236 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
252 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); | 237 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); |
253 | 238 |
254 // Recovery | 239 // Recovery |
255 auto it = media_rtp_packets.begin(); | 240 auto it = media_rtp_packets.begin(); |
256 ++it; // Drop first packet. | 241 ++it; // Drop first packet. |
257 for (; it != media_rtp_packets.end(); ++it) { | 242 for (; it != media_rtp_packets.end(); ++it) { |
258 BuildAndAddRedMediaPacket(*it); | 243 BuildAndAddRedMediaPacket(*it); |
259 VerifyReconstructedMediaPacket(*it, 1); | 244 VerifyReconstructedMediaPacket(*it, 1); |
260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 245 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
261 } | 246 } |
262 BuildAndAddRedFecPacket(fec_packets.front()); | 247 BuildAndAddRedFecPacket(fec_packets.front()); |
263 it = media_rtp_packets.begin(); | 248 it = media_rtp_packets.begin(); |
264 VerifyReconstructedMediaPacket(*it, 1); | 249 VerifyReconstructedMediaPacket(*it, 1); |
265 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 250 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
266 | |
267 DeletePackets(&media_packets); | |
268 } | 251 } |
269 | 252 |
270 TEST_F(ReceiverFecTest, TooManyFrames) { | 253 TEST_F(ReceiverFecTest, TooManyFrames) { |
271 const unsigned int kNumFecPackets = 1u; | 254 const unsigned int kNumFecPackets = 1u; |
272 const unsigned int kNumMediaPackets = 49u; | 255 const unsigned int kNumMediaPackets = 49u; |
273 std::list<test::RawRtpPacket*> media_rtp_packets; | 256 std::list<test::RawRtpPacket*> media_rtp_packets; |
274 ForwardErrorCorrection::PacketList media_packets; | 257 ForwardErrorCorrection::PacketList media_packets; |
275 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { | 258 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { |
276 GenerateFrame(1, i, &media_rtp_packets, &media_packets); | 259 GenerateFrame(1, i, &media_rtp_packets, &media_packets); |
277 } | 260 } |
278 ForwardErrorCorrection::PacketList fec_packets; | 261 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
279 EXPECT_EQ(-1, fec_->GenerateFec(media_packets, | 262 EXPECT_EQ(-1, fec_->GenerateFec(media_packets, |
280 kNumFecPackets * 255 / kNumMediaPackets, 0, | 263 kNumFecPackets * 255 / kNumMediaPackets, 0, |
281 false, kFecMaskBursty, &fec_packets)); | 264 false, kFecMaskBursty, &fec_packets)); |
282 | |
283 DeletePackets(&media_packets); | |
284 } | 265 } |
285 | 266 |
286 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { | 267 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { |
287 // 1 frame with 2 media packets and one FEC packet. One media packet missing. | 268 // 1 frame with 2 media packets and one FEC packet. One media packet missing. |
288 // Delay the FEC packet. | 269 // Delay the FEC packet. |
289 Packet* delayed_fec = NULL; | 270 Packet* delayed_fec = NULL; |
290 const unsigned int kNumFecPacketsBatch1 = 1u; | 271 const unsigned int kNumFecPacketsBatch1 = 1u; |
291 const unsigned int kNumMediaPacketsBatch1 = 2u; | 272 const unsigned int kNumMediaPacketsBatch1 = 2u; |
292 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; | 273 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; |
293 ForwardErrorCorrection::PacketList media_packets_batch1; | 274 ForwardErrorCorrection::PacketList media_packets_batch1; |
294 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, | 275 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, |
295 &media_packets_batch1); | 276 &media_packets_batch1); |
296 ForwardErrorCorrection::PacketList fec_packets; | 277 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
297 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); | 278 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); |
298 | 279 |
299 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); | 280 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); |
300 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 281 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
301 .Times(1).WillRepeatedly(Return(true)); | 282 .Times(1).WillRepeatedly(Return(true)); |
302 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 283 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
303 delayed_fec = fec_packets.front(); | 284 delayed_fec = fec_packets.front(); |
304 | 285 |
305 // Fill the FEC decoder. No packets should be dropped. | 286 // Fill the FEC decoder. No packets should be dropped. |
306 const unsigned int kNumMediaPacketsBatch2 = 46u; | 287 const unsigned int kNumMediaPacketsBatch2 = 46u; |
307 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; | 288 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; |
308 ForwardErrorCorrection::PacketList media_packets_batch2; | 289 ForwardErrorCorrection::PacketList media_packets_batch2; |
309 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { | 290 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { |
310 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); | 291 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); |
311 } | 292 } |
312 for (auto it = media_rtp_packets_batch2.begin(); | 293 for (auto it = media_rtp_packets_batch2.begin(); |
313 it != media_rtp_packets_batch2.end(); ++it) { | 294 it != media_rtp_packets_batch2.end(); ++it) { |
314 BuildAndAddRedMediaPacket(*it); | 295 BuildAndAddRedMediaPacket(*it); |
315 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 296 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
316 .Times(1).WillRepeatedly(Return(true)); | 297 .Times(1).WillRepeatedly(Return(true)); |
317 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 298 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
318 } | 299 } |
319 | 300 |
320 // Add the delayed FEC packet. One packet should be reconstructed. | 301 // Add the delayed FEC packet. One packet should be reconstructed. |
321 BuildAndAddRedFecPacket(delayed_fec); | 302 BuildAndAddRedFecPacket(delayed_fec); |
322 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 303 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
323 .Times(1).WillRepeatedly(Return(true)); | 304 .Times(1).WillRepeatedly(Return(true)); |
324 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 305 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
325 | |
326 DeletePackets(&media_packets_batch1); | |
327 DeletePackets(&media_packets_batch2); | |
328 } | 306 } |
329 | 307 |
330 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { | 308 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { |
331 // 1 frame with 2 media packets and one FEC packet. One media packet missing. | 309 // 1 frame with 2 media packets and one FEC packet. One media packet missing. |
332 // Delay the FEC packet. | 310 // Delay the FEC packet. |
333 Packet* delayed_fec = NULL; | 311 Packet* delayed_fec = NULL; |
334 const unsigned int kNumFecPacketsBatch1 = 1u; | 312 const unsigned int kNumFecPacketsBatch1 = 1u; |
335 const unsigned int kNumMediaPacketsBatch1 = 2u; | 313 const unsigned int kNumMediaPacketsBatch1 = 2u; |
336 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; | 314 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; |
337 ForwardErrorCorrection::PacketList media_packets_batch1; | 315 ForwardErrorCorrection::PacketList media_packets_batch1; |
338 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, | 316 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, |
339 &media_packets_batch1); | 317 &media_packets_batch1); |
340 ForwardErrorCorrection::PacketList fec_packets; | 318 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
341 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); | 319 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); |
342 | 320 |
343 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); | 321 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); |
344 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 322 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
345 .Times(1).WillRepeatedly(Return(true)); | 323 .Times(1).WillRepeatedly(Return(true)); |
346 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 324 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
347 delayed_fec = fec_packets.front(); | 325 delayed_fec = fec_packets.front(); |
348 | 326 |
349 // Fill the FEC decoder and force the last packet to be dropped. | 327 // Fill the FEC decoder and force the last packet to be dropped. |
350 const unsigned int kNumMediaPacketsBatch2 = 48u; | 328 const unsigned int kNumMediaPacketsBatch2 = 48u; |
351 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; | 329 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; |
352 ForwardErrorCorrection::PacketList media_packets_batch2; | 330 ForwardErrorCorrection::PacketList media_packets_batch2; |
353 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { | 331 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { |
354 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); | 332 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); |
355 } | 333 } |
356 for (auto it = media_rtp_packets_batch2.begin(); | 334 for (auto it = media_rtp_packets_batch2.begin(); |
357 it != media_rtp_packets_batch2.end(); ++it) { | 335 it != media_rtp_packets_batch2.end(); ++it) { |
358 BuildAndAddRedMediaPacket(*it); | 336 BuildAndAddRedMediaPacket(*it); |
359 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 337 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
360 .Times(1).WillRepeatedly(Return(true)); | 338 .Times(1).WillRepeatedly(Return(true)); |
361 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 339 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
362 } | 340 } |
363 | 341 |
364 // Add the delayed FEC packet. No packet should be reconstructed since the | 342 // Add the delayed FEC packet. No packet should be reconstructed since the |
365 // first media packet of that frame has been dropped due to being too old. | 343 // first media packet of that frame has been dropped due to being too old. |
366 BuildAndAddRedFecPacket(delayed_fec); | 344 BuildAndAddRedFecPacket(delayed_fec); |
367 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 345 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
368 .Times(0); | 346 .Times(0); |
369 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 347 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
370 | |
371 DeletePackets(&media_packets_batch1); | |
372 DeletePackets(&media_packets_batch2); | |
373 } | 348 } |
374 | 349 |
375 TEST_F(ReceiverFecTest, OldFecPacketDropped) { | 350 TEST_F(ReceiverFecTest, OldFecPacketDropped) { |
376 // 49 frames with 2 media packets and one FEC packet. All media packets | 351 // 49 frames with 2 media packets and one FEC packet. All media packets |
377 // missing. | 352 // missing. |
378 const unsigned int kNumMediaPackets = 49 * 2; | 353 const unsigned int kNumMediaPackets = 49 * 2; |
379 std::list<test::RawRtpPacket*> media_rtp_packets; | 354 std::list<test::RawRtpPacket*> media_rtp_packets; |
380 ForwardErrorCorrection::PacketList media_packets; | 355 ForwardErrorCorrection::PacketList media_packets; |
381 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { | 356 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { |
382 std::list<test::RawRtpPacket*> frame_media_rtp_packets; | 357 std::list<test::RawRtpPacket*> frame_media_rtp_packets; |
383 ForwardErrorCorrection::PacketList frame_media_packets; | 358 ForwardErrorCorrection::PacketList frame_media_packets; |
384 ForwardErrorCorrection::PacketList fec_packets; | 359 std::list<ForwardErrorCorrection::Packet*> fec_packets; |
385 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); | 360 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); |
386 GenerateFec(&frame_media_packets, &fec_packets, 1); | 361 GenerateFec(&frame_media_packets, &fec_packets, 1); |
387 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { | 362 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { |
388 // Only FEC packets inserted. No packets recoverable at this time. | 363 // Only FEC packets inserted. No packets recoverable at this time. |
389 BuildAndAddRedFecPacket(*it); | 364 BuildAndAddRedFecPacket(*it); |
390 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 365 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
391 .Times(0); | 366 .Times(0); |
392 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 367 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
393 } | 368 } |
394 media_packets.insert(media_packets.end(), frame_media_packets.begin(), | 369 // Move unique_ptr's to media_packets for lifetime management. |
395 frame_media_packets.end()); | 370 media_packets.insert(media_packets.end(), |
371 std::make_move_iterator(frame_media_packets.begin()), | |
372 std::make_move_iterator(frame_media_packets.end())); | |
396 media_rtp_packets.insert(media_rtp_packets.end(), | 373 media_rtp_packets.insert(media_rtp_packets.end(), |
397 frame_media_rtp_packets.begin(), | 374 frame_media_rtp_packets.begin(), |
398 frame_media_rtp_packets.end()); | 375 frame_media_rtp_packets.end()); |
399 } | 376 } |
400 // Insert the oldest media packet. The corresponding FEC packet is too old | 377 // Insert the oldest media packet. The corresponding FEC packet is too old |
401 // and should've been dropped. Only the media packet we inserted will be | 378 // and should've been dropped. Only the media packet we inserted will be |
402 // returned. | 379 // returned. |
403 BuildAndAddRedMediaPacket(media_rtp_packets.front()); | 380 BuildAndAddRedMediaPacket(media_rtp_packets.front()); |
404 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | 381 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) |
405 .Times(1).WillRepeatedly(Return(true)); | 382 .Times(1).WillRepeatedly(Return(true)); |
406 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 383 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
407 | |
408 DeletePackets(&media_packets); | |
409 } | 384 } |
410 | 385 |
411 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, | 386 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data, |
412 size_t length, | 387 size_t length, |
413 uint8_t ulpfec_payload_type) { | 388 uint8_t ulpfec_payload_type) { |
414 webrtc::RTPHeader header; | 389 webrtc::RTPHeader header; |
415 std::unique_ptr<webrtc::RtpHeaderParser> parser( | 390 std::unique_ptr<webrtc::RtpHeaderParser> parser( |
416 webrtc::RtpHeaderParser::Create()); | 391 webrtc::RtpHeaderParser::Create()); |
417 ASSERT_TRUE(parser->Parse(data, length, &header)); | 392 ASSERT_TRUE(parser->Parse(data, length, &header)); |
418 | 393 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
530 0x27, | 505 0x27, |
531 0xc4, | 506 0xc4, |
532 0x2a, | 507 0x2a, |
533 0x21, | 508 0x21, |
534 0x2a, | 509 0x2a, |
535 0x28}; | 510 0x28}; |
536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); | 511 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); |
537 } | 512 } |
538 | 513 |
539 } // namespace webrtc | 514 } // namespace webrtc |
OLD | NEW |