| Index: webrtc/video/video_send_stream_tests.cc
|
| diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
|
| index 47a961369bc8bf2cfe51f8a0c23e44530d6bc9dd..00322300e4dde02ab3a3b8080393157204f8a186 100644
|
| --- a/webrtc/video/video_send_stream_tests.cc
|
| +++ b/webrtc/video/video_send_stream_tests.cc
|
| @@ -127,12 +127,11 @@ TEST_F(VideoSendStreamTest, SupportsCName) {
|
| }
|
|
|
| TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) {
|
| - static const uint8_t kAbsSendTimeExtensionId = 13;
|
| class AbsoluteSendTimeObserver : public test::SendTest {
|
| public:
|
| AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) {
|
| EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
|
| - kRtpExtensionAbsoluteSendTime, kAbsSendTimeExtensionId));
|
| + kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId));
|
| }
|
|
|
| Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
| @@ -152,8 +151,8 @@ TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) {
|
| std::vector<VideoReceiveStream::Config>* receive_configs,
|
| VideoEncoderConfig* encoder_config) override {
|
| send_config->rtp.extensions.clear();
|
| - send_config->rtp.extensions.push_back(
|
| - RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId));
|
| + send_config->rtp.extensions.push_back(RtpExtension(
|
| + RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
|
| }
|
|
|
| void PerformTest() override {
|
| @@ -310,81 +309,123 @@ class FakeReceiveStatistics : public NullReceiveStatistics {
|
| StatisticianMap stats_map_;
|
| };
|
|
|
| -TEST_F(VideoSendStreamTest, SupportsFec) {
|
| - class FecObserver : public test::SendTest {
|
| - public:
|
| - FecObserver()
|
| - : SendTest(kDefaultTimeoutMs),
|
| - send_count_(0),
|
| - received_media_(false),
|
| - received_fec_(false) {
|
| - }
|
| +class FecObserver : public test::SendTest {
|
| + public:
|
| + explicit FecObserver(bool header_extensions_enabled)
|
| + : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
|
| + send_count_(0),
|
| + received_media_(false),
|
| + received_fec_(false),
|
| + header_extensions_enabled_(header_extensions_enabled) {}
|
|
|
| - private:
|
| - Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
| - RTPHeader header;
|
| - EXPECT_TRUE(parser_->Parse(packet, length, &header));
|
| + private:
|
| + Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
| + RTPHeader header;
|
| + EXPECT_TRUE(parser_->Parse(packet, length, &header));
|
|
|
| - // Send lossy receive reports to trigger FEC enabling.
|
| - if (send_count_++ % 2 != 0) {
|
| - // Receive statistics reporting having lost 50% of the packets.
|
| - FakeReceiveStatistics lossy_receive_stats(
|
| - kSendSsrcs[0], header.sequenceNumber, send_count_ / 2, 127);
|
| - RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
|
| - &lossy_receive_stats, nullptr,
|
| - transport_adapter_.get());
|
| + // Send lossy receive reports to trigger FEC enabling.
|
| + if (send_count_++ % 2 != 0) {
|
| + // Receive statistics reporting having lost 50% of the packets.
|
| + FakeReceiveStatistics lossy_receive_stats(
|
| + VideoSendStreamTest::kSendSsrcs[0], header.sequenceNumber,
|
| + send_count_ / 2, 127);
|
| + RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
|
| + &lossy_receive_stats, nullptr,
|
| + transport_adapter_.get());
|
|
|
| - rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
|
| - rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]);
|
| + rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
|
| + rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kSendSsrcs[0]);
|
|
|
| - RTCPSender::FeedbackState feedback_state;
|
| + RTCPSender::FeedbackState feedback_state;
|
|
|
| - EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
|
| - }
|
| + EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
|
| + }
|
|
|
| - int encapsulated_payload_type = -1;
|
| - if (header.payloadType == kRedPayloadType) {
|
| - encapsulated_payload_type =
|
| - static_cast<int>(packet[header.headerLength]);
|
| - if (encapsulated_payload_type != kFakeSendPayloadType)
|
| - EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
|
| + int encapsulated_payload_type = -1;
|
| + if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
|
| + encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
|
| + if (encapsulated_payload_type !=
|
| + VideoSendStreamTest::kFakeSendPayloadType)
|
| + EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
|
| + encapsulated_payload_type);
|
| + } else {
|
| + EXPECT_EQ(VideoSendStreamTest::kFakeSendPayloadType, header.payloadType);
|
| + }
|
| +
|
| + if (header_extensions_enabled_) {
|
| + EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
|
| + uint32_t kHalf24BitsSpace = 0xFFFFFF / 2;
|
| + if (header.extension.absoluteSendTime <= kHalf24BitsSpace &&
|
| + prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) {
|
| + // 24 bits wrap.
|
| + EXPECT_GT(prev_header_.extension.absoluteSendTime,
|
| + header.extension.absoluteSendTime);
|
| } else {
|
| - EXPECT_EQ(kFakeSendPayloadType, header.payloadType);
|
| + EXPECT_GE(header.extension.absoluteSendTime,
|
| + prev_header_.extension.absoluteSendTime);
|
| }
|
| + EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
|
| + uint16_t seq_num_diff = header.extension.transportSequenceNumber -
|
| + prev_header_.extension.transportSequenceNumber;
|
| + EXPECT_EQ(1, seq_num_diff);
|
| + }
|
|
|
| - if (encapsulated_payload_type != -1) {
|
| - if (encapsulated_payload_type == kUlpfecPayloadType) {
|
| - received_fec_ = true;
|
| - } else {
|
| - received_media_ = true;
|
| - }
|
| + if (encapsulated_payload_type != -1) {
|
| + if (encapsulated_payload_type ==
|
| + VideoSendStreamTest::kUlpfecPayloadType) {
|
| + received_fec_ = true;
|
| + } else {
|
| + received_media_ = true;
|
| }
|
| + }
|
|
|
| - if (received_media_ && received_fec_)
|
| - observation_complete_->Set();
|
| + if (received_media_ && received_fec_ && send_count_ > 100)
|
| + observation_complete_->Set();
|
|
|
| - return SEND_PACKET;
|
| - }
|
| + prev_header_ = header;
|
|
|
| - void ModifyConfigs(VideoSendStream::Config* send_config,
|
| - std::vector<VideoReceiveStream::Config>* receive_configs,
|
| - VideoEncoderConfig* encoder_config) override {
|
| - transport_adapter_.reset(
|
| - new internal::TransportAdapter(send_config->send_transport));
|
| - transport_adapter_->Enable();
|
| - send_config->rtp.fec.red_payload_type = kRedPayloadType;
|
| - send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
|
| - }
|
| + return SEND_PACKET;
|
| + }
|
|
|
| - void PerformTest() override {
|
| - EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets.";
|
| + void ModifyConfigs(VideoSendStream::Config* send_config,
|
| + std::vector<VideoReceiveStream::Config>* receive_configs,
|
| + VideoEncoderConfig* encoder_config) override {
|
| + transport_adapter_.reset(
|
| + new internal::TransportAdapter(send_config->send_transport));
|
| + transport_adapter_->Enable();
|
| + send_config->rtp.fec.red_payload_type =
|
| + VideoSendStreamTest::kRedPayloadType;
|
| + send_config->rtp.fec.ulpfec_payload_type =
|
| + VideoSendStreamTest::kUlpfecPayloadType;
|
| + if (header_extensions_enabled_) {
|
| + send_config->rtp.extensions.push_back(RtpExtension(
|
| + RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
|
| + send_config->rtp.extensions.push_back(
|
| + RtpExtension(RtpExtension::kTransportSequenceNumber,
|
| + test::kTransportSequenceNumberExtensionId));
|
| }
|
| + }
|
|
|
| - rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
|
| - int send_count_;
|
| - bool received_media_;
|
| - bool received_fec_;
|
| - } test;
|
| + void PerformTest() override {
|
| + EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets.";
|
| + }
|
| +
|
| + rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
|
| + int send_count_;
|
| + bool received_media_;
|
| + bool received_fec_;
|
| + bool header_extensions_enabled_;
|
| + RTPHeader prev_header_;
|
| +};
|
| +
|
| +TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
|
| + FecObserver test(true);
|
| +
|
| + RunBaseTest(&test, FakeNetworkPipe::Config());
|
| +}
|
| +
|
| +TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
|
| + FecObserver test(false);
|
|
|
| RunBaseTest(&test, FakeNetworkPipe::Config());
|
| }
|
|
|