Chromium Code Reviews

Side by Side Diff: webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc

Issue 1710103004: webrtc::RtpPacket name freed for better RtpPacket (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
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
11 #include <string.h> 11 #include <string.h>
12 12
13 #include <list> 13 #include <list>
14 14
15 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webrtc/base/scoped_ptr.h" 17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/modules/rtp_rtcp/include/fec_receiver.h" 18 #include "webrtc/modules/rtp_rtcp/include/fec_receiver.h"
19 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 19 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
20 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" 20 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
22 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" 22 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" 23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
24 24
25 using ::testing::_; 25 using ::testing::_;
26 using ::testing::Args; 26 using ::testing::Args;
27 using ::testing::ElementsAreArray; 27 using ::testing::ElementsAreArray;
28 using ::testing::Return; 28 using ::testing::Return;
29 using Packet = webrtc::ForwardErrorCorrection::Packet;
29 30
30 namespace webrtc { 31 namespace webrtc {
31 32
32 class ReceiverFecTest : public ::testing::Test { 33 class ReceiverFecTest : public ::testing::Test {
33 protected: 34 protected:
34 virtual void SetUp() { 35 virtual void SetUp() {
35 fec_.reset(new ForwardErrorCorrection()); 36 fec_.reset(new ForwardErrorCorrection());
36 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_)); 37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_));
37 generator_.reset(new FrameGenerator()); 38 generator_.reset(new FrameGenerator());
38 } 39 }
39 40
40 void GenerateFEC(std::list<Packet*>* media_packets, 41 void GenerateFEC(std::list<Packet*>* media_packets,
41 std::list<Packet*>* fec_packets, 42 std::list<Packet*>* fec_packets,
42 unsigned int num_fec_packets) { 43 unsigned int num_fec_packets) {
43 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); 44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size();
44 EXPECT_EQ(0, fec_->GenerateFEC(*media_packets, protection_factor, 45 EXPECT_EQ(0, fec_->GenerateFEC(*media_packets, protection_factor,
45 0, false, kFecMaskBursty, fec_packets)); 46 0, false, kFecMaskBursty, fec_packets));
46 ASSERT_EQ(num_fec_packets, fec_packets->size()); 47 ASSERT_EQ(num_fec_packets, fec_packets->size());
47 } 48 }
48 49
49 void GenerateFrame(int num_media_packets, int frame_offset, 50 void GenerateFrame(int num_media_packets,
50 std::list<RtpPacket*>* media_rtp_packets, 51 int frame_offset,
52 std::list<FecRtpPacket*>* media_rtp_packets,
51 std::list<Packet*>* media_packets) { 53 std::list<Packet*>* media_packets) {
52 generator_->NewFrame(num_media_packets); 54 generator_->NewFrame(num_media_packets);
53 for (int i = 0; i < num_media_packets; ++i) { 55 for (int i = 0; i < num_media_packets; ++i) {
54 media_rtp_packets->push_back( 56 media_rtp_packets->push_back(
55 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); 57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10));
56 media_packets->push_back(media_rtp_packets->back()); 58 media_packets->push_back(media_rtp_packets->back());
57 } 59 }
58 } 60 }
59 61
60 void VerifyReconstructedMediaPacket(const RtpPacket* packet, int times) { 62 void VerifyReconstructedMediaPacket(const FecRtpPacket* packet, int times) {
61 // Verify that the content of the reconstructed packet is equal to the 63 // Verify that the content of the reconstructed packet is equal to the
62 // content of |packet|, and that the same content is received |times| number 64 // content of |packet|, and that the same content is received |times| number
63 // of times in a row. 65 // of times in a row.
64 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) 66 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length))
65 .With(Args<0, 1>(ElementsAreArray(packet->data, 67 .With(Args<0, 1>(ElementsAreArray(packet->data,
66 packet->length))) 68 packet->length)))
67 .Times(times).WillRepeatedly(Return(true)); 69 .Times(times).WillRepeatedly(Return(true));
68 } 70 }
69 71
70 void BuildAndAddRedMediaPacket(RtpPacket* packet) { 72 void BuildAndAddRedMediaPacket(FecRtpPacket* packet) {
71 RtpPacket* red_packet = generator_->BuildMediaRedPacket(packet); 73 FecRtpPacket* red_packet = generator_->BuildMediaRedPacket(packet);
72 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 74 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
73 red_packet->header.header, red_packet->data, 75 red_packet->header.header, red_packet->data,
74 red_packet->length, kFecPayloadType)); 76 red_packet->length, kFecPayloadType));
75 delete red_packet; 77 delete red_packet;
76 } 78 }
77 79
78 void BuildAndAddRedFecPacket(Packet* packet) { 80 void BuildAndAddRedFecPacket(Packet* packet) {
79 RtpPacket* red_packet = generator_->BuildFecRedPacket(packet); 81 FecRtpPacket* red_packet = generator_->BuildFecRedPacket(packet);
80 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 82 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
81 red_packet->header.header, red_packet->data, 83 red_packet->header.header, red_packet->data,
82 red_packet->length, kFecPayloadType)); 84 red_packet->length, kFecPayloadType));
83 delete red_packet; 85 delete red_packet;
84 } 86 }
85 87
86 void InjectGarbagePacketLength(size_t fec_garbage_offset); 88 void InjectGarbagePacketLength(size_t fec_garbage_offset);
87 static void SurvivesMaliciousPacket(const uint8_t* data, 89 static void SurvivesMaliciousPacket(const uint8_t* data,
88 size_t length, 90 size_t length,
89 uint8_t ulpfec_payload_type); 91 uint8_t ulpfec_payload_type);
90 92
91 MockRtpData rtp_data_callback_; 93 MockRtpData rtp_data_callback_;
92 rtc::scoped_ptr<ForwardErrorCorrection> fec_; 94 rtc::scoped_ptr<ForwardErrorCorrection> fec_;
93 rtc::scoped_ptr<FecReceiver> receiver_fec_; 95 rtc::scoped_ptr<FecReceiver> receiver_fec_;
94 rtc::scoped_ptr<FrameGenerator> generator_; 96 rtc::scoped_ptr<FrameGenerator> generator_;
95 }; 97 };
96 98
97 void DeletePackets(std::list<Packet*>* packets) { 99 void DeletePackets(std::list<Packet*>* packets) {
98 while (!packets->empty()) { 100 while (!packets->empty()) {
99 delete packets->front(); 101 delete packets->front();
100 packets->pop_front(); 102 packets->pop_front();
101 } 103 }
102 } 104 }
103 105
104 TEST_F(ReceiverFecTest, TwoMediaOneFec) { 106 TEST_F(ReceiverFecTest, TwoMediaOneFec) {
105 const unsigned int kNumFecPackets = 1u; 107 const unsigned int kNumFecPackets = 1u;
106 std::list<RtpPacket*> media_rtp_packets; 108 std::list<FecRtpPacket*> media_rtp_packets;
107 std::list<Packet*> media_packets; 109 std::list<Packet*> media_packets;
108 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 110 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
109 std::list<Packet*> fec_packets; 111 std::list<Packet*> fec_packets;
110 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 112 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
111 113
112 // Recovery 114 // Recovery
113 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 115 std::list<FecRtpPacket*>::iterator it = media_rtp_packets.begin();
114 BuildAndAddRedMediaPacket(*it); 116 BuildAndAddRedMediaPacket(*it);
115 VerifyReconstructedMediaPacket(*it, 1); 117 VerifyReconstructedMediaPacket(*it, 1);
116 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 118 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
117 // Drop one media packet. 119 // Drop one media packet.
118 std::list<Packet*>::iterator fec_it = fec_packets.begin(); 120 std::list<Packet*>::iterator fec_it = fec_packets.begin();
119 BuildAndAddRedFecPacket(*fec_it); 121 BuildAndAddRedFecPacket(*fec_it);
120 ++it; 122 ++it;
121 VerifyReconstructedMediaPacket(*it, 1); 123 VerifyReconstructedMediaPacket(*it, 1);
122 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 124 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
123 125
124 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 126 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
125 EXPECT_EQ(2U, counter.num_packets); 127 EXPECT_EQ(2U, counter.num_packets);
126 EXPECT_EQ(1U, counter.num_fec_packets); 128 EXPECT_EQ(1U, counter.num_fec_packets);
127 EXPECT_EQ(1U, counter.num_recovered_packets); 129 EXPECT_EQ(1U, counter.num_recovered_packets);
128 130
129 DeletePackets(&media_packets); 131 DeletePackets(&media_packets);
130 } 132 }
131 133
132 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { 134 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
133 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 135 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
134 .WillRepeatedly(Return(true)); 136 .WillRepeatedly(Return(true));
135 137
136 const unsigned int kNumFecPackets = 1u; 138 const unsigned int kNumFecPackets = 1u;
137 std::list<RtpPacket*> media_rtp_packets; 139 std::list<FecRtpPacket*> media_rtp_packets;
138 std::list<Packet*> media_packets; 140 std::list<Packet*> media_packets;
139 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 141 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
140 std::list<Packet*> fec_packets; 142 std::list<Packet*> fec_packets;
141 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 143 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
142 ByteWriter<uint16_t>::WriteBigEndian( 144 ByteWriter<uint16_t>::WriteBigEndian(
143 &fec_packets.front()->data[fec_garbage_offset], 0x4711); 145 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
144 146
145 // Inject first media packet, then first FEC packet, skipping the second media 147 // Inject first media packet, then first FEC packet, skipping the second media
146 // packet to cause a recovery from the FEC packet. 148 // packet to cause a recovery from the FEC packet.
147 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 149 BuildAndAddRedMediaPacket(media_rtp_packets.front());
(...skipping 14 matching lines...)
162 } 164 }
163 165
164 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { 166 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) {
165 // Byte offset 10 is the 'protection length' field in the first FEC level 167 // Byte offset 10 is the 'protection length' field in the first FEC level
166 // header. 168 // header.
167 InjectGarbagePacketLength(10); 169 InjectGarbagePacketLength(10);
168 } 170 }
169 171
170 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { 172 TEST_F(ReceiverFecTest, TwoMediaTwoFec) {
171 const unsigned int kNumFecPackets = 2u; 173 const unsigned int kNumFecPackets = 2u;
172 std::list<RtpPacket*> media_rtp_packets; 174 std::list<FecRtpPacket*> media_rtp_packets;
173 std::list<Packet*> media_packets; 175 std::list<Packet*> media_packets;
174 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 176 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
175 std::list<Packet*> fec_packets; 177 std::list<Packet*> fec_packets;
176 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 178 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
177 179
178 // Recovery 180 // Recovery
179 // Drop both media packets. 181 // Drop both media packets.
180 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 182 std::list<FecRtpPacket*>::iterator it = media_rtp_packets.begin();
181 std::list<Packet*>::iterator fec_it = fec_packets.begin(); 183 std::list<Packet*>::iterator fec_it = fec_packets.begin();
182 BuildAndAddRedFecPacket(*fec_it); 184 BuildAndAddRedFecPacket(*fec_it);
183 VerifyReconstructedMediaPacket(*it, 1); 185 VerifyReconstructedMediaPacket(*it, 1);
184 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 186 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
185 ++fec_it; 187 ++fec_it;
186 BuildAndAddRedFecPacket(*fec_it); 188 BuildAndAddRedFecPacket(*fec_it);
187 ++it; 189 ++it;
188 VerifyReconstructedMediaPacket(*it, 1); 190 VerifyReconstructedMediaPacket(*it, 1);
189 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 191 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
190 192
191 DeletePackets(&media_packets); 193 DeletePackets(&media_packets);
192 } 194 }
193 195
194 TEST_F(ReceiverFecTest, TwoFramesOneFec) { 196 TEST_F(ReceiverFecTest, TwoFramesOneFec) {
195 const unsigned int kNumFecPackets = 1u; 197 const unsigned int kNumFecPackets = 1u;
196 std::list<RtpPacket*> media_rtp_packets; 198 std::list<FecRtpPacket*> media_rtp_packets;
197 std::list<Packet*> media_packets; 199 std::list<Packet*> media_packets;
198 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 200 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
199 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); 201 GenerateFrame(1, 1, &media_rtp_packets, &media_packets);
200 std::list<Packet*> fec_packets; 202 std::list<Packet*> fec_packets;
201 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 203 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
202 204
203 // Recovery 205 // Recovery
204 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 206 std::list<FecRtpPacket*>::iterator it = media_rtp_packets.begin();
205 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 207 BuildAndAddRedMediaPacket(media_rtp_packets.front());
206 VerifyReconstructedMediaPacket(*it, 1); 208 VerifyReconstructedMediaPacket(*it, 1);
207 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 209 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
208 // Drop one media packet. 210 // Drop one media packet.
209 BuildAndAddRedFecPacket(fec_packets.front()); 211 BuildAndAddRedFecPacket(fec_packets.front());
210 ++it; 212 ++it;
211 VerifyReconstructedMediaPacket(*it, 1); 213 VerifyReconstructedMediaPacket(*it, 1);
212 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 214 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
213 215
214 DeletePackets(&media_packets); 216 DeletePackets(&media_packets);
215 } 217 }
216 218
217 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { 219 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) {
218 const unsigned int kNumFecPackets = 1u; 220 const unsigned int kNumFecPackets = 1u;
219 std::list<RtpPacket*> media_rtp_packets; 221 std::list<FecRtpPacket*> media_rtp_packets;
220 std::list<Packet*> media_packets; 222 std::list<Packet*> media_packets;
221 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 223 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
222 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); 224 GenerateFrame(2, 1, &media_rtp_packets, &media_packets);
223 225
224 std::list<Packet*> fec_packets; 226 std::list<Packet*> fec_packets;
225 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 227 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
226 228
227 // Recovery 229 // Recovery
228 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 230 std::list<FecRtpPacket*>::iterator it = media_rtp_packets.begin();
229 BuildAndAddRedMediaPacket(*it); // First frame: one packet. 231 BuildAndAddRedMediaPacket(*it); // First frame: one packet.
230 VerifyReconstructedMediaPacket(*it, 1); 232 VerifyReconstructedMediaPacket(*it, 1);
231 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 233 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
232 ++it; 234 ++it;
233 BuildAndAddRedMediaPacket(*it); // First packet of second frame. 235 BuildAndAddRedMediaPacket(*it); // First packet of second frame.
234 VerifyReconstructedMediaPacket(*it, 1); 236 VerifyReconstructedMediaPacket(*it, 1);
235 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 237 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
236 238
237 DeletePackets(&media_packets); 239 DeletePackets(&media_packets);
238 } 240 }
239 241
240 TEST_F(ReceiverFecTest, MaxFramesOneFec) { 242 TEST_F(ReceiverFecTest, MaxFramesOneFec) {
241 const unsigned int kNumFecPackets = 1u; 243 const unsigned int kNumFecPackets = 1u;
242 const unsigned int kNumMediaPackets = 48u; 244 const unsigned int kNumMediaPackets = 48u;
243 std::list<RtpPacket*> media_rtp_packets; 245 std::list<FecRtpPacket*> media_rtp_packets;
244 std::list<Packet*> media_packets; 246 std::list<Packet*> media_packets;
245 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 247 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
246 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 248 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
247 } 249 }
248 std::list<Packet*> fec_packets; 250 std::list<Packet*> fec_packets;
249 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 251 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
250 252
251 // Recovery 253 // Recovery
252 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 254 std::list<FecRtpPacket*>::iterator it = media_rtp_packets.begin();
253 ++it; // Drop first packet. 255 ++it; // Drop first packet.
254 for (; it != media_rtp_packets.end(); ++it) { 256 for (; it != media_rtp_packets.end(); ++it) {
255 BuildAndAddRedMediaPacket(*it); 257 BuildAndAddRedMediaPacket(*it);
256 VerifyReconstructedMediaPacket(*it, 1); 258 VerifyReconstructedMediaPacket(*it, 1);
257 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 259 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
258 } 260 }
259 BuildAndAddRedFecPacket(fec_packets.front()); 261 BuildAndAddRedFecPacket(fec_packets.front());
260 it = media_rtp_packets.begin(); 262 it = media_rtp_packets.begin();
261 VerifyReconstructedMediaPacket(*it, 1); 263 VerifyReconstructedMediaPacket(*it, 1);
262 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 264 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
263 265
264 DeletePackets(&media_packets); 266 DeletePackets(&media_packets);
265 } 267 }
266 268
267 TEST_F(ReceiverFecTest, TooManyFrames) { 269 TEST_F(ReceiverFecTest, TooManyFrames) {
268 const unsigned int kNumFecPackets = 1u; 270 const unsigned int kNumFecPackets = 1u;
269 const unsigned int kNumMediaPackets = 49u; 271 const unsigned int kNumMediaPackets = 49u;
270 std::list<RtpPacket*> media_rtp_packets; 272 std::list<FecRtpPacket*> media_rtp_packets;
271 std::list<Packet*> media_packets; 273 std::list<Packet*> media_packets;
272 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 274 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
273 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 275 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
274 } 276 }
275 std::list<Packet*> fec_packets; 277 std::list<Packet*> fec_packets;
276 EXPECT_EQ(-1, fec_->GenerateFEC(media_packets, 278 EXPECT_EQ(-1, fec_->GenerateFEC(media_packets,
277 kNumFecPackets * 255 / kNumMediaPackets, 0, 279 kNumFecPackets * 255 / kNumMediaPackets, 0,
278 false, kFecMaskBursty, &fec_packets)); 280 false, kFecMaskBursty, &fec_packets));
279 281
280 DeletePackets(&media_packets); 282 DeletePackets(&media_packets);
281 } 283 }
282 284
283 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { 285 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) {
284 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 286 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
285 // Delay the FEC packet. 287 // Delay the FEC packet.
286 Packet* delayed_fec = NULL; 288 Packet* delayed_fec = NULL;
287 const unsigned int kNumFecPacketsBatch1 = 1u; 289 const unsigned int kNumFecPacketsBatch1 = 1u;
288 const unsigned int kNumMediaPacketsBatch1 = 2u; 290 const unsigned int kNumMediaPacketsBatch1 = 2u;
289 std::list<RtpPacket*> media_rtp_packets_batch1; 291 std::list<FecRtpPacket*> media_rtp_packets_batch1;
290 std::list<Packet*> media_packets_batch1; 292 std::list<Packet*> media_packets_batch1;
291 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 293 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
292 &media_packets_batch1); 294 &media_packets_batch1);
293 std::list<Packet*> fec_packets; 295 std::list<Packet*> fec_packets;
294 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 296 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
295 297
296 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 298 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
297 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 299 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
298 .Times(1).WillRepeatedly(Return(true)); 300 .Times(1).WillRepeatedly(Return(true));
299 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 301 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
300 delayed_fec = fec_packets.front(); 302 delayed_fec = fec_packets.front();
301 303
302 // Fill the FEC decoder. No packets should be dropped. 304 // Fill the FEC decoder. No packets should be dropped.
303 const unsigned int kNumMediaPacketsBatch2 = 46u; 305 const unsigned int kNumMediaPacketsBatch2 = 46u;
304 std::list<RtpPacket*> media_rtp_packets_batch2; 306 std::list<FecRtpPacket*> media_rtp_packets_batch2;
305 std::list<Packet*> media_packets_batch2; 307 std::list<Packet*> media_packets_batch2;
306 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 308 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
307 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 309 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
308 } 310 }
309 for (std::list<RtpPacket*>::iterator it = media_rtp_packets_batch2.begin(); 311 for (std::list<FecRtpPacket*>::iterator it = media_rtp_packets_batch2.begin();
310 it != media_rtp_packets_batch2.end(); ++it) { 312 it != media_rtp_packets_batch2.end(); ++it) {
311 BuildAndAddRedMediaPacket(*it); 313 BuildAndAddRedMediaPacket(*it);
312 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 314 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
313 .Times(1).WillRepeatedly(Return(true)); 315 .Times(1).WillRepeatedly(Return(true));
314 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 316 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
315 } 317 }
316 318
317 // Add the delayed FEC packet. One packet should be reconstructed. 319 // Add the delayed FEC packet. One packet should be reconstructed.
318 BuildAndAddRedFecPacket(delayed_fec); 320 BuildAndAddRedFecPacket(delayed_fec);
319 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 321 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
320 .Times(1).WillRepeatedly(Return(true)); 322 .Times(1).WillRepeatedly(Return(true));
321 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 323 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
322 324
323 DeletePackets(&media_packets_batch1); 325 DeletePackets(&media_packets_batch1);
324 DeletePackets(&media_packets_batch2); 326 DeletePackets(&media_packets_batch2);
325 } 327 }
326 328
327 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { 329 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) {
328 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 330 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
329 // Delay the FEC packet. 331 // Delay the FEC packet.
330 Packet* delayed_fec = NULL; 332 Packet* delayed_fec = NULL;
331 const unsigned int kNumFecPacketsBatch1 = 1u; 333 const unsigned int kNumFecPacketsBatch1 = 1u;
332 const unsigned int kNumMediaPacketsBatch1 = 2u; 334 const unsigned int kNumMediaPacketsBatch1 = 2u;
333 std::list<RtpPacket*> media_rtp_packets_batch1; 335 std::list<FecRtpPacket*> media_rtp_packets_batch1;
334 std::list<Packet*> media_packets_batch1; 336 std::list<Packet*> media_packets_batch1;
335 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 337 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
336 &media_packets_batch1); 338 &media_packets_batch1);
337 std::list<Packet*> fec_packets; 339 std::list<Packet*> fec_packets;
338 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 340 GenerateFEC(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
339 341
340 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 342 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
341 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 343 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
342 .Times(1).WillRepeatedly(Return(true)); 344 .Times(1).WillRepeatedly(Return(true));
343 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 345 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
344 delayed_fec = fec_packets.front(); 346 delayed_fec = fec_packets.front();
345 347
346 // Fill the FEC decoder and force the last packet to be dropped. 348 // Fill the FEC decoder and force the last packet to be dropped.
347 const unsigned int kNumMediaPacketsBatch2 = 48u; 349 const unsigned int kNumMediaPacketsBatch2 = 48u;
348 std::list<RtpPacket*> media_rtp_packets_batch2; 350 std::list<FecRtpPacket*> media_rtp_packets_batch2;
349 std::list<Packet*> media_packets_batch2; 351 std::list<Packet*> media_packets_batch2;
350 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 352 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
351 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 353 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
352 } 354 }
353 for (std::list<RtpPacket*>::iterator it = media_rtp_packets_batch2.begin(); 355 for (std::list<FecRtpPacket*>::iterator it = media_rtp_packets_batch2.begin();
354 it != media_rtp_packets_batch2.end(); ++it) { 356 it != media_rtp_packets_batch2.end(); ++it) {
355 BuildAndAddRedMediaPacket(*it); 357 BuildAndAddRedMediaPacket(*it);
356 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 358 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
357 .Times(1).WillRepeatedly(Return(true)); 359 .Times(1).WillRepeatedly(Return(true));
358 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 360 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
359 } 361 }
360 362
361 // Add the delayed FEC packet. No packet should be reconstructed since the 363 // Add the delayed FEC packet. No packet should be reconstructed since the
362 // first media packet of that frame has been dropped due to being too old. 364 // first media packet of that frame has been dropped due to being too old.
363 BuildAndAddRedFecPacket(delayed_fec); 365 BuildAndAddRedFecPacket(delayed_fec);
364 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 366 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
365 .Times(0); 367 .Times(0);
366 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 368 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
367 369
368 DeletePackets(&media_packets_batch1); 370 DeletePackets(&media_packets_batch1);
369 DeletePackets(&media_packets_batch2); 371 DeletePackets(&media_packets_batch2);
370 } 372 }
371 373
372 TEST_F(ReceiverFecTest, OldFecPacketDropped) { 374 TEST_F(ReceiverFecTest, OldFecPacketDropped) {
373 // 49 frames with 2 media packets and one FEC packet. All media packets 375 // 49 frames with 2 media packets and one FEC packet. All media packets
374 // missing. 376 // missing.
375 const unsigned int kNumMediaPackets = 49 * 2; 377 const unsigned int kNumMediaPackets = 49 * 2;
376 std::list<RtpPacket*> media_rtp_packets; 378 std::list<FecRtpPacket*> media_rtp_packets;
377 std::list<Packet*> media_packets; 379 std::list<Packet*> media_packets;
378 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { 380 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) {
379 std::list<RtpPacket*> frame_media_rtp_packets; 381 std::list<FecRtpPacket*> frame_media_rtp_packets;
380 std::list<Packet*> frame_media_packets; 382 std::list<Packet*> frame_media_packets;
381 std::list<Packet*> fec_packets; 383 std::list<Packet*> fec_packets;
382 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); 384 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets);
383 GenerateFEC(&frame_media_packets, &fec_packets, 1); 385 GenerateFEC(&frame_media_packets, &fec_packets, 1);
384 for (std::list<Packet*>::iterator it = fec_packets.begin(); 386 for (std::list<Packet*>::iterator it = fec_packets.begin();
385 it != fec_packets.end(); ++it) { 387 it != fec_packets.end(); ++it) {
386 // Only FEC packets inserted. No packets recoverable at this time. 388 // Only FEC packets inserted. No packets recoverable at this time.
387 BuildAndAddRedFecPacket(*it); 389 BuildAndAddRedFecPacket(*it);
388 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 390 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
389 .Times(0); 391 .Times(0);
(...skipping 138 matching lines...)
528 0x27, 530 0x27,
529 0xc4, 531 0xc4,
530 0x2a, 532 0x2a,
531 0x21, 533 0x21,
532 0x2a, 534 0x2a,
533 0x28}; 535 0x28};
534 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
535 } 537 }
536 538
537 } // namespace webrtc 539 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/rtp_rtcp/source/fec_test_helper.h » ('j') | webrtc/modules/rtp_rtcp/source/fec_test_helper.h » ('J')

Powered by Google App Engine