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

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 type. 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 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2;
372 transport_adapter_.reset( 358 if (header.extension.absoluteSendTime <= kHalf24BitsSpace &&
373 new internal::TransportAdapter(send_config->send_transport)); 359 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) {
374 transport_adapter_->Enable(); 360 // 24 bits wrap.
375 send_config->rtp.fec.red_payload_type = kRedPayloadType; 361 EXPECT_GT(prev_header_.extension.absoluteSendTime,
376 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 362 header.extension.absoluteSendTime);
363 } else {
364 EXPECT_GE(header.extension.absoluteSendTime,
365 prev_header_.extension.absoluteSendTime);
366 }
367 EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
368 uint16_t seq_num_diff = header.extension.transportSequenceNumber -
369 prev_header_.extension.transportSequenceNumber;
370 EXPECT_EQ(1, seq_num_diff);
377 } 371 }
378 372
379 void PerformTest() override { 373 if (encapsulated_payload_type != -1) {
380 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; 374 if (encapsulated_payload_type ==
375 VideoSendStreamTest::kUlpfecPayloadType) {
376 received_fec_ = true;
377 } else {
378 received_media_ = true;
379 }
381 } 380 }
382 381
383 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_; 382 if (received_media_ && received_fec_ && send_count_ > 100)
384 int send_count_; 383 observation_complete_->Set();
385 bool received_media_; 384
386 bool received_fec_; 385 prev_header_ = header;
387 } test; 386
387 return SEND_PACKET;
388 }
389
390 void ModifyConfigs(VideoSendStream::Config* send_config,
391 std::vector<VideoReceiveStream::Config>* receive_configs,
392 VideoEncoderConfig* encoder_config) override {
393 transport_adapter_.reset(
394 new internal::TransportAdapter(send_config->send_transport));
395 transport_adapter_->Enable();
396 send_config->rtp.fec.red_payload_type =
397 VideoSendStreamTest::kRedPayloadType;
398 send_config->rtp.fec.ulpfec_payload_type =
399 VideoSendStreamTest::kUlpfecPayloadType;
400 if (header_extensions_enabled_) {
401 send_config->rtp.extensions.push_back(RtpExtension(
402 RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
403 send_config->rtp.extensions.push_back(
404 RtpExtension(RtpExtension::kTransportSequenceNumber,
405 test::kTransportSequenceNumberExtensionId));
406 }
407 }
408
409 void PerformTest() override {
410 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets.";
411 }
412
413 rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
414 int send_count_;
415 bool received_media_;
416 bool received_fec_;
417 bool header_extensions_enabled_;
418 RTPHeader prev_header_;
419 };
420
421 TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
422 FecObserver test(true);
388 423
389 RunBaseTest(&test, FakeNetworkPipe::Config()); 424 RunBaseTest(&test, FakeNetworkPipe::Config());
390 } 425 }
426
427 TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
428 FecObserver test(false);
429
430 RunBaseTest(&test, FakeNetworkPipe::Config());
431 }
391 432
392 void VideoSendStreamTest::TestNackRetransmission( 433 void VideoSendStreamTest::TestNackRetransmission(
393 uint32_t retransmit_ssrc, 434 uint32_t retransmit_ssrc,
394 uint8_t retransmit_payload_type) { 435 uint8_t retransmit_payload_type) {
395 class NackObserver : public test::SendTest { 436 class NackObserver : public test::SendTest {
396 public: 437 public:
397 explicit NackObserver(uint32_t retransmit_ssrc, 438 explicit NackObserver(uint32_t retransmit_ssrc,
398 uint8_t retransmit_payload_type) 439 uint8_t retransmit_payload_type)
399 : SendTest(kDefaultTimeoutMs), 440 : SendTest(kDefaultTimeoutMs),
400 send_count_(0), 441 send_count_(0),
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after
2169 EXPECT_GT(vp9_header.num_ref_pics, 0u); 2210 EXPECT_GT(vp9_header.num_ref_pics, 0u);
2170 observation_complete_->Set(); 2211 observation_complete_->Set();
2171 } 2212 }
2172 } 2213 }
2173 } test; 2214 } test;
2174 2215
2175 RunBaseTest(&test, FakeNetworkPipe::Config()); 2216 RunBaseTest(&test, FakeNetworkPipe::Config());
2176 } 2217 }
2177 2218
2178 } // namespace webrtc 2219 } // 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