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

Side by Side Diff: webrtc/video/video_send_stream_tests.cc

Issue 1506863002: Add test which verifies that the RTP header extensions are set correctly for FEC packets. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix build Created 5 years 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
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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 #include <algorithm> // max 10 #include <algorithm> // max
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void PerformTest() override { 120 void PerformTest() override {
121 EXPECT_EQ(kEventSignaled, Wait()) 121 EXPECT_EQ(kEventSignaled, Wait())
122 << "Timed out while waiting for RTCP with CNAME."; 122 << "Timed out while waiting for RTCP with CNAME.";
123 } 123 }
124 } test; 124 } test;
125 125
126 RunBaseTest(&test, FakeNetworkPipe::Config()); 126 RunBaseTest(&test, FakeNetworkPipe::Config());
127 } 127 }
128 128
129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { 129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) {
130 static const uint8_t kAbsSendTimeExtensionId = 13;
131 class AbsoluteSendTimeObserver : public test::SendTest { 130 class AbsoluteSendTimeObserver : public test::SendTest {
132 public: 131 public:
133 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { 132 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) {
134 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( 133 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
135 kRtpExtensionAbsoluteSendTime, kAbsSendTimeExtensionId)); 134 kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId));
136 } 135 }
137 136
138 Action OnSendRtp(const uint8_t* packet, size_t length) override { 137 Action OnSendRtp(const uint8_t* packet, size_t length) override {
139 RTPHeader header; 138 RTPHeader header;
140 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 139 EXPECT_TRUE(parser_->Parse(packet, length, &header));
141 140
142 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); 141 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
143 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); 142 EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
144 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); 143 EXPECT_EQ(header.extension.transmissionTimeOffset, 0);
145 EXPECT_GT(header.extension.absoluteSendTime, 0u); 144 EXPECT_GT(header.extension.absoluteSendTime, 0u);
146 observation_complete_->Set(); 145 observation_complete_->Set();
147 146
148 return SEND_PACKET; 147 return SEND_PACKET;
149 } 148 }
150 149
151 void ModifyConfigs(VideoSendStream::Config* send_config, 150 void ModifyConfigs(VideoSendStream::Config* send_config,
152 std::vector<VideoReceiveStream::Config>* receive_configs, 151 std::vector<VideoReceiveStream::Config>* receive_configs,
153 VideoEncoderConfig* encoder_config) override { 152 VideoEncoderConfig* encoder_config) override {
154 send_config->rtp.extensions.clear(); 153 send_config->rtp.extensions.clear();
155 send_config->rtp.extensions.push_back( 154 send_config->rtp.extensions.push_back(RtpExtension(
156 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId)); 155 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
157 } 156 }
158 157
159 void PerformTest() override { 158 void PerformTest() override {
160 EXPECT_EQ(kEventSignaled, Wait()) 159 EXPECT_EQ(kEventSignaled, Wait())
161 << "Timed out while waiting for single RTP packet."; 160 << "Timed out while waiting for single RTP packet.";
162 } 161 }
163 } test; 162 } test;
164 163
165 RunBaseTest(&test, FakeNetworkPipe::Config()); 164 RunBaseTest(&test, FakeNetworkPipe::Config());
166 } 165 }
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 return true; 302 return true;
304 } 303 }
305 304
306 RtcpStatistics stats_; 305 RtcpStatistics stats_;
307 }; 306 };
308 307
309 rtc::scoped_ptr<LossyStatistician> lossy_stats_; 308 rtc::scoped_ptr<LossyStatistician> lossy_stats_;
310 StatisticianMap stats_map_; 309 StatisticianMap stats_map_;
311 }; 310 };
312 311
313 TEST_F(VideoSendStreamTest, SupportsFec) { 312 class FecObserver : public test::SendTest {
314 class FecObserver : public test::SendTest { 313 public:
315 public: 314 explicit FecObserver(bool header_extensions_enabled)
316 FecObserver() 315 : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
317 : SendTest(kDefaultTimeoutMs), 316 send_count_(0),
318 send_count_(0), 317 received_media_(false),
319 received_media_(false), 318 received_fec_(false),
320 received_fec_(false) { 319 header_extensions_enabled_(header_extensions_enabled) {}
320
321 private:
322 Action OnSendRtp(const uint8_t* packet, size_t length) override {
323 RTPHeader header;
324 EXPECT_TRUE(parser_->Parse(packet, length, &header));
325
326 // Send lossy receive reports to trigger FEC enabling.
327 if (send_count_++ % 2 != 0) {
328 // Receive statistics reporting having lost 50% of the packets.
329 FakeReceiveStatistics lossy_receive_stats(
330 VideoSendStreamTest::kSendSsrcs[0], header.sequenceNumber,
331 send_count_ / 2, 127);
332 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
333 &lossy_receive_stats, nullptr,
334 transport_adapter_.get());
335
336 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
337 rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kSendSsrcs[0]);
338
339 RTCPSender::FeedbackState feedback_state;
340
341 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
321 } 342 }
322 343
323 private: 344 int encapsulated_payload_type = -1;
324 Action OnSendRtp(const uint8_t* packet, size_t length) override { 345 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
325 RTPHeader header; 346 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
326 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 347 if (encapsulated_payload_type !=
327 348 VideoSendStreamTest::kFakeSendPayloadType)
328 // Send lossy receive reports to trigger FEC enabling. 349 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
329 if (send_count_++ % 2 != 0) { 350 encapsulated_payload_type);
330 // Receive statistics reporting having lost 50% of the packets. 351 } else {
331 FakeReceiveStatistics lossy_receive_stats( 352 EXPECT_EQ(VideoSendStreamTest::kFakeSendPayloadType, header.payloadType);
332 kSendSsrcs[0], header.sequenceNumber, send_count_ / 2, 127);
333 RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
334 &lossy_receive_stats, nullptr,
335 transport_adapter_.get());
336
337 rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
338 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]);
339
340 RTCPSender::FeedbackState feedback_state;
341
342 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
343 }
344
345 int encapsulated_payload_type = -1;
346 if (header.payloadType == kRedPayloadType) {
347 encapsulated_payload_type =
348 static_cast<int>(packet[header.headerLength]);
349 if (encapsulated_payload_type != kFakeSendPayloadType)
350 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
351 } else {
352 EXPECT_EQ(kFakeSendPayloadType, header.payloadType);
353 }
354
355 if (encapsulated_payload_type != -1) {
356 if (encapsulated_payload_type == kUlpfecPayloadType) {
357 received_fec_ = true;
358 } else {
359 received_media_ = true;
360 }
361 }
362
363 if (received_media_ && received_fec_)
364 observation_complete_->Set();
365
366 return SEND_PACKET;
367 } 353 }
368 354
369 void ModifyConfigs(VideoSendStream::Config* send_config, 355 if (header_extensions_enabled_) {
370 std::vector<VideoReceiveStream::Config>* receive_configs, 356 EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
371 VideoEncoderConfig* encoder_config) override { 357 EXPECT_GE(header.extension.absoluteSendTime,
pbos-webrtc 2015/12/07 15:43:59 Might wrap.
372 transport_adapter_.reset( 358 prev_header_.extension.absoluteSendTime);
373 new internal::TransportAdapter(send_config->send_transport)); 359 EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
374 transport_adapter_->Enable(); 360 EXPECT_EQ(prev_header_.extension.transportSequenceNumber + 1,
pbos-webrtc 2015/12/07 15:43:59 Might wrap
375 send_config->rtp.fec.red_payload_type = kRedPayloadType; 361 header.extension.transportSequenceNumber);
376 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
377 } 362 }
378 363
379 void PerformTest() override { 364 if (encapsulated_payload_type != -1) {
380 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; 365 if (encapsulated_payload_type ==
366 VideoSendStreamTest::kUlpfecPayloadType) {
367 received_fec_ = true;
368 } else {
369 received_media_ = true;
370 }
381 } 371 }
382 372
383 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; 373 if (received_media_ && received_fec_ && send_count_ > 100)
384 int send_count_; 374 observation_complete_->Set();
385 bool received_media_; 375
386 bool received_fec_; 376 prev_header_ = header;
387 } test; 377
378 return SEND_PACKET;
379 }
380
381 void ModifyConfigs(VideoSendStream::Config* send_config,
382 std::vector<VideoReceiveStream::Config>* receive_configs,
383 VideoEncoderConfig* encoder_config) override {
384 transport_adapter_.reset(
385 new internal::TransportAdapter(send_config->send_transport));
386 transport_adapter_->Enable();
387 send_config->rtp.fec.red_payload_type =
388 VideoSendStreamTest::kRedPayloadType;
389 send_config->rtp.fec.ulpfec_payload_type =
390 VideoSendStreamTest::kUlpfecPayloadType;
391 if (header_extensions_enabled_) {
392 send_config->rtp.extensions.push_back(RtpExtension(
393 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
394 send_config->rtp.extensions.push_back(
395 RtpExtension(RtpExtension::kTransportSequenceNumber,
396 test::kTransportSequenceNumberExtensionId));
397 }
398 }
399
400 void PerformTest() override {
401 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets.";
402 }
403
404 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
405 int send_count_;
406 bool received_media_;
407 bool received_fec_;
408 bool header_extensions_enabled_;
409 RTPHeader prev_header_;
410 };
411
412 TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
413 FecObserver test(true);
388 414
389 RunBaseTest(&test, FakeNetworkPipe::Config()); 415 RunBaseTest(&test, FakeNetworkPipe::Config());
390 } 416 }
417
418 TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
419 FecObserver test(false);
420
421 RunBaseTest(&test, FakeNetworkPipe::Config());
422 }
391 423
392 void VideoSendStreamTest::TestNackRetransmission( 424 void VideoSendStreamTest::TestNackRetransmission(
393 uint32_t retransmit_ssrc, 425 uint32_t retransmit_ssrc,
394 uint8_t retransmit_payload_type) { 426 uint8_t retransmit_payload_type) {
395 class NackObserver : public test::SendTest { 427 class NackObserver : public test::SendTest {
396 public: 428 public:
397 explicit NackObserver(uint32_t retransmit_ssrc, 429 explicit NackObserver(uint32_t retransmit_ssrc,
398 uint8_t retransmit_payload_type) 430 uint8_t retransmit_payload_type)
399 : SendTest(kDefaultTimeoutMs), 431 : SendTest(kDefaultTimeoutMs),
400 send_count_(0), 432 send_count_(0),
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after
2169 EXPECT_GT(vp9_header.num_ref_pics, 0u); 2201 EXPECT_GT(vp9_header.num_ref_pics, 0u);
2170 observation_complete_->Set(); 2202 observation_complete_->Set();
2171 } 2203 }
2172 } 2204 }
2173 } test; 2205 } test;
2174 2206
2175 RunBaseTest(&test, FakeNetworkPipe::Config()); 2207 RunBaseTest(&test, FakeNetworkPipe::Config());
2176 } 2208 }
2177 2209
2178 } // namespace webrtc 2210 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698