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 |
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/interface/fec_receiver.h" | 18 #include "webrtc/modules/rtp_rtcp/interface/fec_receiver.h" |
19 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" | 19 #include "webrtc/modules/rtp_rtcp/interface/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/fec_test_helper.h" | 22 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" |
22 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" | 23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" |
23 | 24 |
24 using ::testing::_; | 25 using ::testing::_; |
25 using ::testing::Args; | 26 using ::testing::Args; |
26 using ::testing::ElementsAreArray; | 27 using ::testing::ElementsAreArray; |
27 using ::testing::Return; | 28 using ::testing::Return; |
28 | 29 |
29 namespace webrtc { | 30 namespace webrtc { |
30 | 31 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 } | 76 } |
76 | 77 |
77 void BuildAndAddRedFecPacket(Packet* packet) { | 78 void BuildAndAddRedFecPacket(Packet* packet) { |
78 RtpPacket* red_packet = generator_->BuildFecRedPacket(packet); | 79 RtpPacket* red_packet = generator_->BuildFecRedPacket(packet); |
79 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( | 80 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( |
80 red_packet->header.header, red_packet->data, | 81 red_packet->header.header, red_packet->data, |
81 red_packet->length, kFecPayloadType)); | 82 red_packet->length, kFecPayloadType)); |
82 delete red_packet; | 83 delete red_packet; |
83 } | 84 } |
84 | 85 |
86 void InjectGarbagePacketLength(size_t fec_garbage_offset); | |
85 static void SurvivesMaliciousPacket(const uint8_t* data, | 87 static void SurvivesMaliciousPacket(const uint8_t* data, |
86 size_t length, | 88 size_t length, |
87 uint8_t ulpfec_payload_type); | 89 uint8_t ulpfec_payload_type); |
88 | 90 |
89 MockRtpData rtp_data_callback_; | 91 MockRtpData rtp_data_callback_; |
90 rtc::scoped_ptr<ForwardErrorCorrection> fec_; | 92 rtc::scoped_ptr<ForwardErrorCorrection> fec_; |
91 rtc::scoped_ptr<FecReceiver> receiver_fec_; | 93 rtc::scoped_ptr<FecReceiver> receiver_fec_; |
92 rtc::scoped_ptr<FrameGenerator> generator_; | 94 rtc::scoped_ptr<FrameGenerator> generator_; |
93 }; | 95 }; |
94 | 96 |
95 void DeletePackets(std::list<Packet*>* packets) { | 97 void DeletePackets(std::list<Packet*>* packets) { |
96 while (!packets->empty()) { | 98 while (!packets->empty()) { |
97 delete packets->front(); | 99 delete packets->front(); |
98 packets->pop_front(); | 100 packets->pop_front(); |
99 } | 101 } |
100 } | 102 } |
101 | 103 |
102 TEST_F(ReceiverFecTest, TwoMediaOneFec) { | 104 TEST_F(ReceiverFecTest, TwoMediaOneFec) { |
103 const unsigned int kNumFecPackets = 1u; | 105 const unsigned int kNumFecPackets = 1u; |
104 std::list<RtpPacket*> media_rtp_packets; | 106 std::list<RtpPacket*> media_rtp_packets; |
105 std::list<Packet*> media_packets; | 107 std::list<Packet*> media_packets; |
106 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 108 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
107 std::list<Packet*> fec_packets; | 109 std::list<Packet*> fec_packets; |
108 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 110 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); |
109 | 111 |
110 // Recovery | 112 // Recovery |
111 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); | 113 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); |
112 std::list<RtpPacket*>::iterator media_it = media_rtp_packets.begin(); | 114 BuildAndAddRedMediaPacket(*it); |
113 BuildAndAddRedMediaPacket(*media_it); | |
114 VerifyReconstructedMediaPacket(*it, 1); | 115 VerifyReconstructedMediaPacket(*it, 1); |
115 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 116 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
116 // Drop one media packet. | 117 // Drop one media packet. |
117 std::list<Packet*>::iterator fec_it = fec_packets.begin(); | 118 std::list<Packet*>::iterator fec_it = fec_packets.begin(); |
118 BuildAndAddRedFecPacket(*fec_it); | 119 BuildAndAddRedFecPacket(*fec_it); |
119 ++it; | 120 ++it; |
120 VerifyReconstructedMediaPacket(*it, 1); | 121 VerifyReconstructedMediaPacket(*it, 1); |
121 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | 122 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); |
122 | 123 |
123 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | 124 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); |
124 EXPECT_EQ(2U, counter.num_packets); | 125 EXPECT_EQ(2U, counter.num_packets); |
125 EXPECT_EQ(1U, counter.num_fec_packets); | 126 EXPECT_EQ(1U, counter.num_fec_packets); |
126 EXPECT_EQ(1U, counter.num_recovered_packets); | 127 EXPECT_EQ(1U, counter.num_recovered_packets); |
127 | 128 |
128 DeletePackets(&media_packets); | 129 DeletePackets(&media_packets); |
129 } | 130 } |
130 | 131 |
132 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) { | |
133 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _)) | |
134 .WillRepeatedly(Return(true)); | |
135 | |
136 const unsigned int kNumFecPackets = 1u; | |
137 std::list<RtpPacket*> media_rtp_packets; | |
138 std::list<Packet*> media_packets; | |
139 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | |
140 std::list<Packet*> fec_packets; | |
141 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | |
142 ByteWriter<uint16_t>::WriteBigEndian( | |
143 &fec_packets.front()->data[fec_garbage_offset], 0x4711); | |
144 | |
145 // Recovery | |
146 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); | |
147 BuildAndAddRedMediaPacket(*it); | |
stefan-webrtc
2015/07/02 09:31:25
This doesn't really do any recovery, right? Can yo
pbos-webrtc
2015/07/02 13:54:55
Don't even think I should be running it (line 149)
| |
148 | |
149 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | |
150 // Drop one media packet. | |
151 std::list<Packet*>::iterator fec_it = fec_packets.begin(); | |
152 BuildAndAddRedFecPacket(*fec_it); | |
153 ++it; | |
154 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); | |
155 | |
156 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); | |
157 EXPECT_EQ(2u, counter.num_packets); | |
158 EXPECT_EQ(1u, counter.num_fec_packets); | |
159 EXPECT_EQ(0u, counter.num_recovered_packets); | |
160 | |
161 DeletePackets(&media_packets); | |
162 } | |
163 | |
164 TEST_F(ReceiverFecTest, InjectGarbageRecoveredPacketLength) { | |
165 InjectGarbagePacketLength(8); | |
166 } | |
167 | |
168 TEST_F(ReceiverFecTest, InjectGarbagePacketLength) { | |
169 InjectGarbagePacketLength(10); | |
stefan-webrtc
2015/07/02 09:31:26
Can you comment on why those offsets are interesti
pbos-webrtc
2015/07/02 13:54:55
Done, also updated test names to reflect this.
| |
170 } | |
171 | |
131 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { | 172 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { |
132 const unsigned int kNumFecPackets = 2u; | 173 const unsigned int kNumFecPackets = 2u; |
133 std::list<RtpPacket*> media_rtp_packets; | 174 std::list<RtpPacket*> media_rtp_packets; |
134 std::list<Packet*> media_packets; | 175 std::list<Packet*> media_packets; |
135 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); | 176 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); |
136 std::list<Packet*> fec_packets; | 177 std::list<Packet*> fec_packets; |
137 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); | 178 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); |
138 | 179 |
139 // Recovery | 180 // Recovery |
140 // Drop both media packets. | 181 // Drop both media packets. |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
489 0x27, | 530 0x27, |
490 0xc4, | 531 0xc4, |
491 0x2a, | 532 0x2a, |
492 0x21, | 533 0x21, |
493 0x2a, | 534 0x2a, |
494 0x28}; | 535 0x28}; |
495 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); | 536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); |
496 } | 537 } |
497 | 538 |
498 } // namespace webrtc | 539 } // namespace webrtc |
OLD | NEW |