Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

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

Issue 2267393002: Generalize FEC unit tests and rename GenerateFec. (pt. 3) (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@header_reader_writer-pt2-producer_fec_mini_fixes
Patch Set: Rebase. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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 #include <memory> 14 #include <memory>
15 15
16 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.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 namespace webrtc {
26
27 namespace {
28 constexpr uint8_t kFecPayloadType = 96;
29 } // namespace
30
25 using ::testing::_; 31 using ::testing::_;
26 using ::testing::Args; 32 using ::testing::Args;
27 using ::testing::ElementsAreArray; 33 using ::testing::ElementsAreArray;
28 using ::testing::Return; 34 using ::testing::Return;
29 using Packet = webrtc::ForwardErrorCorrection::Packet;
30 35
31 namespace webrtc { 36 using Packet = ForwardErrorCorrection::Packet;
danilchap 2016/08/23 13:08:49 use full name here too, i.e. using Packet = ::webr
brandtr 2016/08/23 14:05:06 Done.
37 using RawRtpPacket = test::fec::RawRtpPacket;
danilchap 2016/08/23 13:08:49 test::fec is a namespace, so you can write using :
brandtr 2016/08/23 14:05:06 Done.
danilchap 2016/08/23 14:51:18 Not exactly, I meant using ::webrtc::test::fec::R
brandtr 2016/08/23 15:08:00 Got it, thanks.
32 38
33 class ReceiverFecTest : public ::testing::Test { 39 class ReceiverFecTest : public ::testing::Test {
34 protected: 40 protected:
35 virtual void SetUp() { 41 ReceiverFecTest()
36 fec_.reset(new ForwardErrorCorrection()); 42 : receiver_fec_(FecReceiver::Create(&rtp_data_callback_)) {}
37 receiver_fec_.reset(FecReceiver::Create(&rtp_data_callback_));
38 generator_.reset(new FrameGenerator());
39 }
40 43
41 void GenerateFec(ForwardErrorCorrection::PacketList* media_packets, 44 void EncodeFec(ForwardErrorCorrection::PacketList* media_packets,
42 std::list<ForwardErrorCorrection::Packet*>* fec_packets, 45 std::list<ForwardErrorCorrection::Packet*>* fec_packets,
43 unsigned int num_fec_packets) { 46 unsigned int num_fec_packets) {
44 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size(); 47 uint8_t protection_factor = num_fec_packets * 255 / media_packets->size();
45 EXPECT_EQ(0, fec_->GenerateFec(*media_packets, protection_factor, 48 EXPECT_EQ(0, fec_.EncodeFec(*media_packets, protection_factor, 0, false,
46 0, false, kFecMaskBursty, fec_packets)); 49 kFecMaskBursty, fec_packets));
47 ASSERT_EQ(num_fec_packets, fec_packets->size()); 50 ASSERT_EQ(num_fec_packets, fec_packets->size());
48 } 51 }
49 52
50 void GenerateFrame(int num_media_packets, 53 void GenerateFrame(int num_media_packets,
51 int frame_offset, 54 int frame_offset,
52 std::list<test::RawRtpPacket*>* media_rtp_packets, 55 std::list<RawRtpPacket*>* media_rtp_packets,
53 ForwardErrorCorrection::PacketList* media_packets) { 56 ForwardErrorCorrection::PacketList* media_packets) {
54 generator_->NewFrame(num_media_packets); 57 generator_.NewFrame(num_media_packets);
55 for (int i = 0; i < num_media_packets; ++i) { 58 for (int i = 0; i < num_media_packets; ++i) {
56 std::unique_ptr<test::RawRtpPacket> next_packet( 59 std::unique_ptr<RawRtpPacket> next_packet(
57 generator_->NextPacket(frame_offset + i, kRtpHeaderSize + 10)); 60 generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10));
58 media_rtp_packets->push_back(next_packet.get()); 61 media_rtp_packets->push_back(next_packet.get());
59 media_packets->push_back(std::move(next_packet)); 62 media_packets->push_back(std::move(next_packet));
60 } 63 }
61 } 64 }
62 65
63 void VerifyReconstructedMediaPacket(const test::RawRtpPacket* packet, 66 void VerifyReconstructedMediaPacket(const RawRtpPacket* packet,
64 int times) { 67 int times) {
65 // Verify that the content of the reconstructed packet is equal to the 68 // Verify that the content of the reconstructed packet is equal to the
66 // content of |packet|, and that the same content is received |times| number 69 // content of |packet|, and that the same content is received |times| number
67 // of times in a row. 70 // of times in a row.
68 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length)) 71 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet->length))
69 .With(Args<0, 1>(ElementsAreArray(packet->data, 72 .With(Args<0, 1>(ElementsAreArray(packet->data,
70 packet->length))) 73 packet->length)))
71 .Times(times).WillRepeatedly(Return(true)); 74 .Times(times).WillRepeatedly(Return(true));
72 } 75 }
73 76
74 void BuildAndAddRedMediaPacket(test::RawRtpPacket* packet) { 77 void BuildAndAddRedMediaPacket(RawRtpPacket* packet) {
75 std::unique_ptr<test::RawRtpPacket> red_packet( 78 std::unique_ptr<RawRtpPacket> red_packet(
76 generator_->BuildMediaRedPacket(packet)); 79 generator_.BuildMediaRedPacket(packet));
77 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 80 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
78 red_packet->header.header, red_packet->data, 81 red_packet->header.header, red_packet->data,
79 red_packet->length, kFecPayloadType)); 82 red_packet->length, kFecPayloadType));
80 } 83 }
81 84
82 void BuildAndAddRedFecPacket(Packet* packet) { 85 void BuildAndAddRedFecPacket(Packet* packet) {
83 std::unique_ptr<test::RawRtpPacket> red_packet( 86 std::unique_ptr<RawRtpPacket> red_packet(
84 generator_->BuildFecRedPacket(packet)); 87 generator_.BuildFecRedPacket(packet));
85 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 88 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
86 red_packet->header.header, red_packet->data, 89 red_packet->header.header, red_packet->data,
87 red_packet->length, kFecPayloadType)); 90 red_packet->length, kFecPayloadType));
88 } 91 }
89 92
90 void InjectGarbagePacketLength(size_t fec_garbage_offset); 93 void InjectGarbagePacketLength(size_t fec_garbage_offset);
91 static void SurvivesMaliciousPacket(const uint8_t* data, 94 static void SurvivesMaliciousPacket(const uint8_t* data,
92 size_t length, 95 size_t length,
93 uint8_t ulpfec_payload_type); 96 uint8_t ulpfec_payload_type);
94 97
95 MockRtpData rtp_data_callback_; 98 MockRtpData rtp_data_callback_;
96 std::unique_ptr<ForwardErrorCorrection> fec_; 99 ForwardErrorCorrection fec_;
97 std::unique_ptr<FecReceiver> receiver_fec_; 100 std::unique_ptr<FecReceiver> receiver_fec_;
98 std::unique_ptr<FrameGenerator> generator_; 101 test::fec::FrameGenerator generator_;
danilchap 2016/08/23 13:08:49 may be add using ::webrtc::test::fec::FrameGenerat
brandtr 2016/08/23 14:05:06 Done.
99 }; 102 };
100 103
101 TEST_F(ReceiverFecTest, TwoMediaOneFec) { 104 TEST_F(ReceiverFecTest, TwoMediaOneFec) {
102 const unsigned int kNumFecPackets = 1u; 105 const unsigned int kNumFecPackets = 1u;
103 std::list<test::RawRtpPacket*> media_rtp_packets; 106 std::list<RawRtpPacket*> media_rtp_packets;
104 ForwardErrorCorrection::PacketList media_packets; 107 ForwardErrorCorrection::PacketList media_packets;
105 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 108 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
106 std::list<ForwardErrorCorrection::Packet*> fec_packets; 109 std::list<ForwardErrorCorrection::Packet*> fec_packets;
107 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 110 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
108 111
109 // Recovery 112 // Recovery
110 auto it = media_rtp_packets.begin(); 113 auto it = media_rtp_packets.begin();
111 BuildAndAddRedMediaPacket(*it); 114 BuildAndAddRedMediaPacket(*it);
112 VerifyReconstructedMediaPacket(*it, 1); 115 VerifyReconstructedMediaPacket(*it, 1);
113 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 116 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
114 // Drop one media packet. 117 // Drop one media packet.
115 auto fec_it = fec_packets.begin(); 118 auto fec_it = fec_packets.begin();
116 BuildAndAddRedFecPacket(*fec_it); 119 BuildAndAddRedFecPacket(*fec_it);
117 ++it; 120 ++it;
118 VerifyReconstructedMediaPacket(*it, 1); 121 VerifyReconstructedMediaPacket(*it, 1);
119 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 122 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
120 123
121 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 124 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
122 EXPECT_EQ(2U, counter.num_packets); 125 EXPECT_EQ(2U, counter.num_packets);
123 EXPECT_EQ(1U, counter.num_fec_packets); 126 EXPECT_EQ(1U, counter.num_fec_packets);
124 EXPECT_EQ(1U, counter.num_recovered_packets); 127 EXPECT_EQ(1U, counter.num_recovered_packets);
125 } 128 }
126 129
127 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { 130 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
128 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 131 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
129 .WillRepeatedly(Return(true)); 132 .WillRepeatedly(Return(true));
130 133
131 const unsigned int kNumFecPackets = 1u; 134 const unsigned int kNumFecPackets = 1u;
132 std::list<test::RawRtpPacket*> media_rtp_packets; 135 std::list<RawRtpPacket*> media_rtp_packets;
133 ForwardErrorCorrection::PacketList media_packets; 136 ForwardErrorCorrection::PacketList media_packets;
134 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 137 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
135 std::list<ForwardErrorCorrection::Packet*> fec_packets; 138 std::list<ForwardErrorCorrection::Packet*> fec_packets;
136 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 139 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
137 ByteWriter<uint16_t>::WriteBigEndian( 140 ByteWriter<uint16_t>::WriteBigEndian(
138 &fec_packets.front()->data[fec_garbage_offset], 0x4711); 141 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
139 142
140 // Inject first media packet, then first FEC packet, skipping the second media 143 // Inject first media packet, then first FEC packet, skipping the second media
141 // packet to cause a recovery from the FEC packet. 144 // packet to cause a recovery from the FEC packet.
142 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 145 BuildAndAddRedMediaPacket(media_rtp_packets.front());
143 BuildAndAddRedFecPacket(fec_packets.front()); 146 BuildAndAddRedFecPacket(fec_packets.front());
144 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 147 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
145 148
146 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 149 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
147 EXPECT_EQ(2u, counter.num_packets); 150 EXPECT_EQ(2u, counter.num_packets);
148 EXPECT_EQ(1u, counter.num_fec_packets); 151 EXPECT_EQ(1u, counter.num_fec_packets);
149 EXPECT_EQ(0u, counter.num_recovered_packets); 152 EXPECT_EQ(0u, counter.num_recovered_packets);
150 } 153 }
151 154
152 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) { 155 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) {
153 // Byte offset 8 is the 'length recovery' field of the FEC header. 156 // Byte offset 8 is the 'length recovery' field of the FEC header.
154 InjectGarbagePacketLength(8); 157 InjectGarbagePacketLength(8);
155 } 158 }
156 159
157 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) { 160 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) {
158 // Byte offset 10 is the 'protection length' field in the first FEC level 161 // Byte offset 10 is the 'protection length' field in the first FEC level
159 // header. 162 // header.
160 InjectGarbagePacketLength(10); 163 InjectGarbagePacketLength(10);
161 } 164 }
162 165
163 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { 166 TEST_F(ReceiverFecTest, TwoMediaTwoFec) {
164 const unsigned int kNumFecPackets = 2u; 167 const unsigned int kNumFecPackets = 2u;
165 std::list<test::RawRtpPacket*> media_rtp_packets; 168 std::list<RawRtpPacket*> media_rtp_packets;
166 ForwardErrorCorrection::PacketList media_packets; 169 ForwardErrorCorrection::PacketList media_packets;
167 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 170 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
168 std::list<ForwardErrorCorrection::Packet*> fec_packets; 171 std::list<ForwardErrorCorrection::Packet*> fec_packets;
169 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 172 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
170 173
171 // Recovery 174 // Recovery
172 // Drop both media packets. 175 // Drop both media packets.
173 auto it = media_rtp_packets.begin(); 176 auto it = media_rtp_packets.begin();
174 auto fec_it = fec_packets.begin(); 177 auto fec_it = fec_packets.begin();
175 BuildAndAddRedFecPacket(*fec_it); 178 BuildAndAddRedFecPacket(*fec_it);
176 VerifyReconstructedMediaPacket(*it, 1); 179 VerifyReconstructedMediaPacket(*it, 1);
177 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 180 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
178 ++fec_it; 181 ++fec_it;
179 BuildAndAddRedFecPacket(*fec_it); 182 BuildAndAddRedFecPacket(*fec_it);
180 ++it; 183 ++it;
181 VerifyReconstructedMediaPacket(*it, 1); 184 VerifyReconstructedMediaPacket(*it, 1);
182 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 185 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
183 } 186 }
184 187
185 TEST_F(ReceiverFecTest, TwoFramesOneFec) { 188 TEST_F(ReceiverFecTest, TwoFramesOneFec) {
186 const unsigned int kNumFecPackets = 1u; 189 const unsigned int kNumFecPackets = 1u;
187 std::list<test::RawRtpPacket*> media_rtp_packets; 190 std::list<RawRtpPacket*> media_rtp_packets;
188 ForwardErrorCorrection::PacketList media_packets; 191 ForwardErrorCorrection::PacketList media_packets;
189 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 192 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
190 GenerateFrame(1, 1, &media_rtp_packets, &media_packets); 193 GenerateFrame(1, 1, &media_rtp_packets, &media_packets);
191 std::list<ForwardErrorCorrection::Packet*> fec_packets; 194 std::list<ForwardErrorCorrection::Packet*> fec_packets;
192 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 195 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
193 196
194 // Recovery 197 // Recovery
195 auto it = media_rtp_packets.begin(); 198 auto it = media_rtp_packets.begin();
196 BuildAndAddRedMediaPacket(media_rtp_packets.front()); 199 BuildAndAddRedMediaPacket(media_rtp_packets.front());
197 VerifyReconstructedMediaPacket(*it, 1); 200 VerifyReconstructedMediaPacket(*it, 1);
198 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 201 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
199 // Drop one media packet. 202 // Drop one media packet.
200 BuildAndAddRedFecPacket(fec_packets.front()); 203 BuildAndAddRedFecPacket(fec_packets.front());
201 ++it; 204 ++it;
202 VerifyReconstructedMediaPacket(*it, 1); 205 VerifyReconstructedMediaPacket(*it, 1);
203 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 206 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
204 } 207 }
205 208
206 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) { 209 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) {
207 const unsigned int kNumFecPackets = 1u; 210 const unsigned int kNumFecPackets = 1u;
208 std::list<test::RawRtpPacket*> media_rtp_packets; 211 std::list<RawRtpPacket*> media_rtp_packets;
209 ForwardErrorCorrection::PacketList media_packets; 212 ForwardErrorCorrection::PacketList media_packets;
210 GenerateFrame(1, 0, &media_rtp_packets, &media_packets); 213 GenerateFrame(1, 0, &media_rtp_packets, &media_packets);
211 GenerateFrame(2, 1, &media_rtp_packets, &media_packets); 214 GenerateFrame(2, 1, &media_rtp_packets, &media_packets);
212 215
213 std::list<ForwardErrorCorrection::Packet*> fec_packets; 216 std::list<ForwardErrorCorrection::Packet*> fec_packets;
214 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 217 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
215 218
216 // Recovery 219 // Recovery
217 auto it = media_rtp_packets.begin(); 220 auto it = media_rtp_packets.begin();
218 BuildAndAddRedMediaPacket(*it); // First frame: one packet. 221 BuildAndAddRedMediaPacket(*it); // First frame: one packet.
219 VerifyReconstructedMediaPacket(*it, 1); 222 VerifyReconstructedMediaPacket(*it, 1);
220 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 223 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
221 ++it; 224 ++it;
222 BuildAndAddRedMediaPacket(*it); // First packet of second frame. 225 BuildAndAddRedMediaPacket(*it); // First packet of second frame.
223 VerifyReconstructedMediaPacket(*it, 1); 226 VerifyReconstructedMediaPacket(*it, 1);
224 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 227 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
225 } 228 }
226 229
227 TEST_F(ReceiverFecTest, MaxFramesOneFec) { 230 TEST_F(ReceiverFecTest, MaxFramesOneFec) {
228 const unsigned int kNumFecPackets = 1u; 231 const unsigned int kNumFecPackets = 1u;
229 const unsigned int kNumMediaPackets = 48u; 232 const unsigned int kNumMediaPackets = 48u;
230 std::list<test::RawRtpPacket*> media_rtp_packets; 233 std::list<RawRtpPacket*> media_rtp_packets;
231 ForwardErrorCorrection::PacketList media_packets; 234 ForwardErrorCorrection::PacketList media_packets;
232 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 235 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
233 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 236 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
234 } 237 }
235 std::list<ForwardErrorCorrection::Packet*> fec_packets; 238 std::list<ForwardErrorCorrection::Packet*> fec_packets;
236 GenerateFec(&media_packets, &fec_packets, kNumFecPackets); 239 EncodeFec(&media_packets, &fec_packets, kNumFecPackets);
237 240
238 // Recovery 241 // Recovery
239 auto it = media_rtp_packets.begin(); 242 auto it = media_rtp_packets.begin();
240 ++it; // Drop first packet. 243 ++it; // Drop first packet.
241 for (; it != media_rtp_packets.end(); ++it) { 244 for (; it != media_rtp_packets.end(); ++it) {
242 BuildAndAddRedMediaPacket(*it); 245 BuildAndAddRedMediaPacket(*it);
243 VerifyReconstructedMediaPacket(*it, 1); 246 VerifyReconstructedMediaPacket(*it, 1);
244 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 247 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
245 } 248 }
246 BuildAndAddRedFecPacket(fec_packets.front()); 249 BuildAndAddRedFecPacket(fec_packets.front());
247 it = media_rtp_packets.begin(); 250 it = media_rtp_packets.begin();
248 VerifyReconstructedMediaPacket(*it, 1); 251 VerifyReconstructedMediaPacket(*it, 1);
249 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 252 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
250 } 253 }
251 254
252 TEST_F(ReceiverFecTest, TooManyFrames) { 255 TEST_F(ReceiverFecTest, TooManyFrames) {
253 const unsigned int kNumFecPackets = 1u; 256 const unsigned int kNumFecPackets = 1u;
254 const unsigned int kNumMediaPackets = 49u; 257 const unsigned int kNumMediaPackets = 49u;
255 std::list<test::RawRtpPacket*> media_rtp_packets; 258 std::list<RawRtpPacket*> media_rtp_packets;
256 ForwardErrorCorrection::PacketList media_packets; 259 ForwardErrorCorrection::PacketList media_packets;
257 for (unsigned int i = 0; i < kNumMediaPackets; ++i) { 260 for (unsigned int i = 0; i < kNumMediaPackets; ++i) {
258 GenerateFrame(1, i, &media_rtp_packets, &media_packets); 261 GenerateFrame(1, i, &media_rtp_packets, &media_packets);
259 } 262 }
260 std::list<ForwardErrorCorrection::Packet*> fec_packets; 263 std::list<ForwardErrorCorrection::Packet*> fec_packets;
261 EXPECT_EQ(-1, fec_->GenerateFec(media_packets, 264 EXPECT_EQ(
262 kNumFecPackets * 255 / kNumMediaPackets, 0, 265 -1, fec_.EncodeFec(media_packets, kNumFecPackets * 255 / kNumMediaPackets,
263 false, kFecMaskBursty, &fec_packets)); 266 0, false, kFecMaskBursty, &fec_packets));
264 } 267 }
265 268
266 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) { 269 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) {
267 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 270 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
268 // Delay the FEC packet. 271 // Delay the FEC packet.
269 Packet* delayed_fec = NULL; 272 Packet* delayed_fec = NULL;
270 const unsigned int kNumFecPacketsBatch1 = 1u; 273 const unsigned int kNumFecPacketsBatch1 = 1u;
271 const unsigned int kNumMediaPacketsBatch1 = 2u; 274 const unsigned int kNumMediaPacketsBatch1 = 2u;
272 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; 275 std::list<RawRtpPacket*> media_rtp_packets_batch1;
273 ForwardErrorCorrection::PacketList media_packets_batch1; 276 ForwardErrorCorrection::PacketList media_packets_batch1;
274 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 277 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
275 &media_packets_batch1); 278 &media_packets_batch1);
276 std::list<ForwardErrorCorrection::Packet*> fec_packets; 279 std::list<ForwardErrorCorrection::Packet*> fec_packets;
277 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 280 EncodeFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
278 281
279 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 282 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
280 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 283 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
281 .Times(1).WillRepeatedly(Return(true)); 284 .Times(1).WillRepeatedly(Return(true));
282 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 285 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
283 delayed_fec = fec_packets.front(); 286 delayed_fec = fec_packets.front();
284 287
285 // Fill the FEC decoder. No packets should be dropped. 288 // Fill the FEC decoder. No packets should be dropped.
286 const unsigned int kNumMediaPacketsBatch2 = 46u; 289 const unsigned int kNumMediaPacketsBatch2 = 46u;
287 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; 290 std::list<RawRtpPacket*> media_rtp_packets_batch2;
288 ForwardErrorCorrection::PacketList media_packets_batch2; 291 ForwardErrorCorrection::PacketList media_packets_batch2;
289 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 292 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
290 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 293 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
291 } 294 }
292 for (auto it = media_rtp_packets_batch2.begin(); 295 for (auto it = media_rtp_packets_batch2.begin();
293 it != media_rtp_packets_batch2.end(); ++it) { 296 it != media_rtp_packets_batch2.end(); ++it) {
294 BuildAndAddRedMediaPacket(*it); 297 BuildAndAddRedMediaPacket(*it);
295 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 298 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
296 .Times(1).WillRepeatedly(Return(true)); 299 .Times(1).WillRepeatedly(Return(true));
297 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 300 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
298 } 301 }
299 302
300 // Add the delayed FEC packet. One packet should be reconstructed. 303 // Add the delayed FEC packet. One packet should be reconstructed.
301 BuildAndAddRedFecPacket(delayed_fec); 304 BuildAndAddRedFecPacket(delayed_fec);
302 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 305 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
303 .Times(1).WillRepeatedly(Return(true)); 306 .Times(1).WillRepeatedly(Return(true));
304 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 307 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
305 } 308 }
306 309
307 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) { 310 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) {
308 // 1 frame with 2 media packets and one FEC packet. One media packet missing. 311 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
309 // Delay the FEC packet. 312 // Delay the FEC packet.
310 Packet* delayed_fec = NULL; 313 Packet* delayed_fec = NULL;
311 const unsigned int kNumFecPacketsBatch1 = 1u; 314 const unsigned int kNumFecPacketsBatch1 = 1u;
312 const unsigned int kNumMediaPacketsBatch1 = 2u; 315 const unsigned int kNumMediaPacketsBatch1 = 2u;
313 std::list<test::RawRtpPacket*> media_rtp_packets_batch1; 316 std::list<RawRtpPacket*> media_rtp_packets_batch1;
314 ForwardErrorCorrection::PacketList media_packets_batch1; 317 ForwardErrorCorrection::PacketList media_packets_batch1;
315 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1, 318 GenerateFrame(kNumMediaPacketsBatch1, 0, &media_rtp_packets_batch1,
316 &media_packets_batch1); 319 &media_packets_batch1);
317 std::list<ForwardErrorCorrection::Packet*> fec_packets; 320 std::list<ForwardErrorCorrection::Packet*> fec_packets;
318 GenerateFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1); 321 EncodeFec(&media_packets_batch1, &fec_packets, kNumFecPacketsBatch1);
319 322
320 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front()); 323 BuildAndAddRedMediaPacket(media_rtp_packets_batch1.front());
321 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 324 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
322 .Times(1).WillRepeatedly(Return(true)); 325 .Times(1).WillRepeatedly(Return(true));
323 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 326 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
324 delayed_fec = fec_packets.front(); 327 delayed_fec = fec_packets.front();
325 328
326 // Fill the FEC decoder and force the last packet to be dropped. 329 // Fill the FEC decoder and force the last packet to be dropped.
327 const unsigned int kNumMediaPacketsBatch2 = 48u; 330 const unsigned int kNumMediaPacketsBatch2 = 48u;
328 std::list<test::RawRtpPacket*> media_rtp_packets_batch2; 331 std::list<RawRtpPacket*> media_rtp_packets_batch2;
329 ForwardErrorCorrection::PacketList media_packets_batch2; 332 ForwardErrorCorrection::PacketList media_packets_batch2;
330 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) { 333 for (unsigned int i = 0; i < kNumMediaPacketsBatch2; ++i) {
331 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2); 334 GenerateFrame(1, i, &media_rtp_packets_batch2, &media_packets_batch2);
332 } 335 }
333 for (auto it = media_rtp_packets_batch2.begin(); 336 for (auto it = media_rtp_packets_batch2.begin();
334 it != media_rtp_packets_batch2.end(); ++it) { 337 it != media_rtp_packets_batch2.end(); ++it) {
335 BuildAndAddRedMediaPacket(*it); 338 BuildAndAddRedMediaPacket(*it);
336 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 339 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
337 .Times(1).WillRepeatedly(Return(true)); 340 .Times(1).WillRepeatedly(Return(true));
338 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 341 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
339 } 342 }
340 343
341 // Add the delayed FEC packet. No packet should be reconstructed since the 344 // Add the delayed FEC packet. No packet should be reconstructed since the
342 // first media packet of that frame has been dropped due to being too old. 345 // first media packet of that frame has been dropped due to being too old.
343 BuildAndAddRedFecPacket(delayed_fec); 346 BuildAndAddRedFecPacket(delayed_fec);
344 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 347 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
345 .Times(0); 348 .Times(0);
346 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 349 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
347 } 350 }
348 351
349 TEST_F(ReceiverFecTest, OldFecPacketDropped) { 352 TEST_F(ReceiverFecTest, OldFecPacketDropped) {
350 // 49 frames with 2 media packets and one FEC packet. All media packets 353 // 49 frames with 2 media packets and one FEC packet. All media packets
351 // missing. 354 // missing.
352 const unsigned int kNumMediaPackets = 49 * 2; 355 const unsigned int kNumMediaPackets = 49 * 2;
353 std::list<test::RawRtpPacket*> media_rtp_packets; 356 std::list<RawRtpPacket*> media_rtp_packets;
354 ForwardErrorCorrection::PacketList media_packets; 357 ForwardErrorCorrection::PacketList media_packets;
355 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) { 358 for (unsigned int i = 0; i < kNumMediaPackets / 2; ++i) {
356 std::list<test::RawRtpPacket*> frame_media_rtp_packets; 359 std::list<RawRtpPacket*> frame_media_rtp_packets;
357 ForwardErrorCorrection::PacketList frame_media_packets; 360 ForwardErrorCorrection::PacketList frame_media_packets;
358 std::list<ForwardErrorCorrection::Packet*> fec_packets; 361 std::list<ForwardErrorCorrection::Packet*> fec_packets;
359 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets); 362 GenerateFrame(2, 0, &frame_media_rtp_packets, &frame_media_packets);
360 GenerateFec(&frame_media_packets, &fec_packets, 1); 363 EncodeFec(&frame_media_packets, &fec_packets, 1);
361 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) { 364 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) {
362 // Only FEC packets inserted. No packets recoverable at this time. 365 // Only FEC packets inserted. No packets recoverable at this time.
363 BuildAndAddRedFecPacket(*it); 366 BuildAndAddRedFecPacket(*it);
364 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) 367 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
365 .Times(0); 368 .Times(0);
366 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 369 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
367 } 370 }
368 // Move unique_ptr's to media_packets for lifetime management. 371 // Move unique_ptr's to media_packets for lifetime management.
369 media_packets.insert(media_packets.end(), 372 media_packets.insert(media_packets.end(),
370 std::make_move_iterator(frame_media_packets.begin()), 373 std::make_move_iterator(frame_media_packets.begin()),
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 0x27, 507 0x27,
505 0xc4, 508 0xc4,
506 0x2a, 509 0x2a,
507 0x21, 510 0x21,
508 0x2a, 511 0x2a,
509 0x28}; 512 0x28};
510 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 513 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
511 } 514 }
512 515
513 } // namespace webrtc 516 } // 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
This is Rietveld 408576698