Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index f654dbb32ab84b26ae96c78f416676bc2c5ae939..3c774abdff540f7264289caf0ff204eeba0e26ac 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -31,7 +31,6 @@ |
#include "webrtc/test/call_test.h" |
#include "webrtc/test/direct_transport.h" |
#include "webrtc/test/encoder_settings.h" |
-#include "webrtc/test/fake_audio_device.h" |
#include "webrtc/test/fake_decoder.h" |
#include "webrtc/test/fake_encoder.h" |
#include "webrtc/test/frame_generator.h" |
@@ -86,10 +85,10 @@ TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { |
CreateCalls(Call::Config(), Call::Config()); |
test::NullTransport transport; |
- CreateSendConfig(1, &transport); |
+ CreateSendConfig(1, 0, &transport); |
CreateMatchingReceiveConfigs(&transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
video_receive_streams_[0]->Start(); |
video_receive_streams_[0]->Start(); |
@@ -101,10 +100,10 @@ TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) { |
CreateCalls(Call::Config(), Call::Config()); |
test::NullTransport transport; |
- CreateSendConfig(1, &transport); |
+ CreateSendConfig(1, 0, &transport); |
CreateMatchingReceiveConfigs(&transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
video_receive_streams_[0]->Stop(); |
video_receive_streams_[0]->Stop(); |
@@ -158,14 +157,14 @@ TEST_F(EndToEndTest, RendersSingleDelayedFrame) { |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
receiver_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
CreateMatchingReceiveConfigs(&receiver_transport); |
TestFrameCallback pre_render_callback; |
video_receive_configs_[0].pre_render_callback = &pre_render_callback; |
video_receive_configs_[0].renderer = &renderer; |
- CreateStreams(); |
+ CreateVideoStreams(); |
Start(); |
// Create frames that are smaller than the send width/height, this is done to |
@@ -210,11 +209,11 @@ TEST_F(EndToEndTest, TransmitsFirstFrame) { |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
receiver_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
CreateMatchingReceiveConfigs(&receiver_transport); |
video_receive_configs_[0].renderer = &renderer; |
- CreateStreams(); |
+ CreateVideoStreams(); |
Start(); |
rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
@@ -308,7 +307,7 @@ TEST_F(EndToEndTest, SendsAndReceivesH264) { |
(*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
send_config->encoder_settings.encoder = &fake_encoder_; |
send_config->encoder_settings.payload_name = "H264"; |
- send_config->encoder_settings.payload_type = kFakeSendPayloadType; |
+ send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType; |
encoder_config->streams[0].min_bitrate_bps = 50000; |
encoder_config->streams[0].target_bitrate_bps = |
encoder_config->streams[0].max_bitrate_bps = 2000000; |
@@ -353,7 +352,7 @@ TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { |
ssrc |= static_cast<uint32_t>(packet[5]) << 16; |
ssrc |= static_cast<uint32_t>(packet[6]) << 8; |
ssrc |= static_cast<uint32_t>(packet[7]) << 0; |
- EXPECT_EQ(kReceiverLocalSsrc, ssrc); |
+ EXPECT_EQ(kReceiverLocalVideoSsrc, ssrc); |
observation_complete_.Set(); |
return SEND_PACKET; |
@@ -474,10 +473,10 @@ TEST_F(EndToEndTest, CanReceiveFec) { |
if (header.payloadType == kRedPayloadType) { |
encapsulated_payload_type = |
static_cast<int>(packet[header.headerLength]); |
- if (encapsulated_payload_type != kFakeSendPayloadType) |
+ if (encapsulated_payload_type != kFakeVideoSendPayloadType) |
EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
} else { |
- EXPECT_EQ(kFakeSendPayloadType, header.payloadType); |
+ EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |
} |
if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { |
@@ -501,7 +500,7 @@ TEST_F(EndToEndTest, CanReceiveFec) { |
return DROP_PACKET; |
break; |
case kDropNextMediaPacket: |
- if (encapsulated_payload_type == kFakeSendPayloadType) { |
+ if (encapsulated_payload_type == kFakeVideoSendPayloadType) { |
protected_sequence_numbers_.insert(header.sequenceNumber); |
protected_timestamps_.insert(header.timestamp); |
state_ = kDropEveryOtherPacketUntilFec; |
@@ -580,10 +579,10 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) { |
if (header.payloadType == kRedPayloadType) { |
encapsulated_payload_type = |
static_cast<int>(packet[header.headerLength]); |
- if (encapsulated_payload_type != kFakeSendPayloadType) |
+ if (encapsulated_payload_type != kFakeVideoSendPayloadType) |
EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |
} else { |
- EXPECT_EQ(kFakeSendPayloadType, header.payloadType); |
+ EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |
} |
if (has_last_sequence_number_ && |
@@ -698,7 +697,7 @@ void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
explicit RetransmissionObserver(bool use_rtx, bool use_red) |
: EndToEndTest(kDefaultTimeoutMs), |
payload_type_(GetPayloadType(false, use_red)), |
- retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), |
+ retransmission_ssrc_(use_rtx ? kSendRtxSsrcs[0] : kVideoSendSsrcs[0]), |
retransmission_payload_type_(GetPayloadType(use_rtx, use_red)), |
marker_bits_observed_(0), |
num_packets_observed_(0), |
@@ -726,7 +725,7 @@ void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
return SEND_PACKET; |
} |
- EXPECT_EQ(kSendSsrcs[0], header.ssrc); |
+ EXPECT_EQ(kVideoSendSsrcs[0], header.ssrc); |
EXPECT_EQ(payload_type_, header.payloadType); |
// Found the final packet of the frame to inflict loss to, drop this and |
@@ -765,9 +764,9 @@ void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { |
send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
- (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = |
+ (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
kSendRtxSsrcs[0]; |
- (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = |
+ (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
kSendRtxPayloadType; |
} |
} |
@@ -779,7 +778,7 @@ void EndToEndTest::DecodesRetransmittedFrame(bool use_rtx, bool use_red) { |
int GetPayloadType(bool use_rtx, bool use_red) { |
return use_rtx ? kSendRtxPayloadType |
- : (use_red ? kRedPayloadType : kFakeSendPayloadType); |
+ : (use_red ? kRedPayloadType : kFakeVideoSendPayloadType); |
} |
rtc::CriticalSection crit_; |
@@ -876,7 +875,7 @@ TEST_F(EndToEndTest, UsesFrameCallbacks) { |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
receiver_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
rtc::scoped_ptr<VideoEncoder> encoder( |
VideoEncoder::Create(VideoEncoder::kVp8)); |
video_send_config_.encoder_settings.encoder = encoder.get(); |
@@ -890,7 +889,7 @@ TEST_F(EndToEndTest, UsesFrameCallbacks) { |
video_receive_configs_[0].pre_render_callback = &pre_render_callback; |
video_receive_configs_[0].renderer = &renderer; |
- CreateStreams(); |
+ CreateVideoStreams(); |
Start(); |
// Create frames that are smaller than the send width/height, this is done to |
@@ -1050,10 +1049,10 @@ TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) { |
send_transport.SetReceiver(&input_observer); |
receive_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &send_transport); |
+ CreateSendConfig(1, 0, &send_transport); |
CreateMatchingReceiveConfigs(&receive_transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
CreateFrameGeneratorCapturer(); |
Start(); |
@@ -1227,7 +1226,7 @@ class MultiStreamTest { |
VideoReceiveStream::Config receive_config(receiver_transport.get()); |
receive_config.rtp.remote_ssrc = ssrc; |
- receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalSsrc; |
+ receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalVideoSsrc; |
VideoReceiveStream::Decoder decoder = |
test::CreateMatchingDecoder(send_config.encoder_settings); |
allocated_decoders.push_back(decoder.decoder); |
@@ -1659,12 +1658,12 @@ TEST_F(EndToEndTest, ObserversEncodedFrames) { |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
receiver_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
CreateMatchingReceiveConfigs(&receiver_transport); |
video_send_config_.post_encode_callback = &post_encode_observer; |
video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; |
- CreateStreams(); |
+ CreateVideoStreams(); |
Start(); |
rtc::scoped_ptr<test::FrameGenerator> frame_generator( |
@@ -1705,13 +1704,13 @@ TEST_F(EndToEndTest, ReceiveStreamSendsRemb) { |
while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRemb) { |
const RTCPUtility::RTCPPacket& packet = parser.Packet(); |
- EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc); |
+ EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalVideoSsrc); |
received_psfb = true; |
} else if (packet_type == RTCPUtility::RTCPPacketTypes::kPsfbRembItem) { |
const RTCPUtility::RTCPPacket& packet = parser.Packet(); |
EXPECT_GT(packet.REMBItem.BitRate, 0u); |
EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); |
- EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]); |
+ EXPECT_EQ(packet.REMBItem.SSRCs[0], kVideoSendSsrcs[0]); |
received_remb = true; |
} |
packet_type = parser.Iterate(); |
@@ -1825,8 +1824,7 @@ TEST_F(EndToEndTest, VerifyNackStats) { |
receive_stream_nack_packets += |
stats.rtcp_packet_type_counts.nack_packets; |
} |
- if (send_stream_nack_packets >= 1 && |
- receive_stream_nack_packets >= 1) { |
+ if (send_stream_nack_packets >= 1 && receive_stream_nack_packets >= 1) { |
// NACK packet sent on receive stream and received on sent stream. |
if (MinMetricRunTimePassed()) |
observation_complete_.Set(); |
@@ -1940,9 +1938,9 @@ void EndToEndTest::VerifyHistogramStats(bool use_rtx, |
if (use_rtx_) { |
send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); |
send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
- (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].ssrc = |
+ (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].ssrc = |
kSendRtxSsrcs[0]; |
- (*receive_configs)[0].rtp.rtx[kFakeSendPayloadType].payload_type = |
+ (*receive_configs)[0].rtp.rtx[kFakeVideoSendPayloadType].payload_type = |
kSendRtxPayloadType; |
} |
encoder_config->content_type = |
@@ -2236,7 +2234,7 @@ void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, |
return SEND_PACKET; |
} |
- size_t GetNumStreams() const override { return num_ssrcs_; } |
+ size_t GetNumVideoStreams() const override { return num_ssrcs_; } |
void ModifyVideoConfigs( |
VideoSendStream::Config* send_config, |
@@ -2287,7 +2285,7 @@ void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, |
VideoSendStream* send_stream_; |
VideoEncoderConfig video_encoder_config_all_streams_; |
- } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first); |
+ } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first); |
RunBaseTest(&test, FakeNetworkPipe::Config()); |
} |
@@ -2443,9 +2441,9 @@ TEST_F(EndToEndTest, GetStats) { |
stats.rtcp_packet_type_counts.unique_nack_requests != 0; |
assert(stats.current_payload_type == -1 || |
- stats.current_payload_type == kFakeSendPayloadType); |
+ stats.current_payload_type == kFakeVideoSendPayloadType); |
receive_stats_filled_["IncomingPayloadType"] |= |
- stats.current_payload_type == kFakeSendPayloadType; |
+ stats.current_payload_type == kFakeVideoSendPayloadType; |
} |
return AllStatsFilled(receive_stats_filled_); |
@@ -2552,7 +2550,7 @@ TEST_F(EndToEndTest, GetStats) { |
} |
} |
- size_t GetNumStreams() const override { return kNumSsrcs; } |
+ size_t GetNumVideoStreams() const override { return kNumSsrcs; } |
void OnVideoStreamsCreated( |
VideoSendStream* send_stream, |
@@ -2713,7 +2711,7 @@ TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) { |
return SEND_PACKET; |
} |
- size_t GetNumStreams() const override { return kNumSsrcs; } |
+ size_t GetNumVideoStreams() const override { return kNumSsrcs; } |
void ModifyVideoConfigs( |
VideoSendStream::Config* send_config, |
@@ -2759,7 +2757,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
: test::RtpRtcpObserver(kDefaultTimeoutMs), |
ssrcs_to_observe_(kNumSsrcs) { |
for (size_t i = 0; i < kNumSsrcs; ++i) { |
- configured_ssrcs_[kSendSsrcs[i]] = true; |
+ configured_ssrcs_[kVideoSendSsrcs[i]] = true; |
if (use_rtx) |
configured_ssrcs_[kSendRtxSsrcs[i]] = true; |
} |
@@ -2852,7 +2850,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
send_transport.SetReceiver(receiver_call_->Receiver()); |
receive_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(kNumSsrcs, &send_transport); |
+ CreateSendConfig(kNumSsrcs, 0, &send_transport); |
if (use_rtx) { |
for (size_t i = 0; i < kNumSsrcs; ++i) { |
@@ -2883,7 +2881,7 @@ void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { |
CreateMatchingReceiveConfigs(&receive_transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
CreateFrameGeneratorCapturer(); |
Start(); |
@@ -3129,10 +3127,10 @@ TEST_F(EndToEndTest, CallReportsRttForSender) { |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
receiver_transport.SetReceiver(sender_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
CreateMatchingReceiveConfigs(&receiver_transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
CreateFrameGeneratorCapturer(); |
Start(); |
@@ -3170,10 +3168,10 @@ TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) { |
sender_call_->SignalNetworkState(kNetworkDown); |
UnusedTransport transport; |
- CreateSendConfig(1, &transport); |
+ CreateSendConfig(1, 0, &transport); |
UnusedEncoder unused_encoder; |
video_send_config_.encoder_settings.encoder = &unused_encoder; |
- CreateStreams(); |
+ CreateVideoStreams(); |
CreateFrameGeneratorCapturer(); |
Start(); |
@@ -3189,10 +3187,10 @@ TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { |
test::DirectTransport sender_transport(sender_call_.get()); |
sender_transport.SetReceiver(receiver_call_->Receiver()); |
- CreateSendConfig(1, &sender_transport); |
+ CreateSendConfig(1, 0, &sender_transport); |
UnusedTransport transport; |
CreateMatchingReceiveConfigs(&transport); |
- CreateStreams(); |
+ CreateVideoStreams(); |
CreateFrameGeneratorCapturer(); |
Start(); |
@@ -3249,4 +3247,76 @@ TEST_F(EndToEndTest, VerifyDefaultReceiveConfigParameters) { |
VerifyEmptyFecConfig(default_receive_config.rtp.fec); |
} |
+TEST_F(EndToEndTest, TransportSeqNumOnAudioAndVideo) { |
+ static const int kExtensionId = 8; |
+ class TransportSequenceNumberTest : public test::EndToEndTest { |
+ public: |
+ TransportSequenceNumberTest() |
+ : EndToEndTest(kDefaultTimeoutMs), |
+ video_observed_(false), |
+ audio_observed_(false) { |
+ parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, |
+ kExtensionId); |
+ } |
+ |
+ size_t GetNumVideoStreams() const override { return 1; } |
+ size_t GetNumAudioStreams() const override { return 1; } |
+ |
+ void ModifyVideoConfigs( |
+ VideoSendStream::Config* send_config, |
+ std::vector<VideoReceiveStream::Config>* receive_configs, |
+ VideoEncoderConfig* encoder_config) override { |
+ send_config->rtp.extensions.clear(); |
+ send_config->rtp.extensions.push_back( |
+ RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
+ (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions; |
+ } |
+ |
+ void ModifyAudioConfigs( |
+ AudioSendStream::Config* send_config, |
+ std::vector<AudioReceiveStream::Config>* receive_configs) override { |
+ send_config->rtp.extensions.clear(); |
+ send_config->rtp.extensions.push_back( |
+ RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
+ (*receive_configs)[0].rtp.extensions.clear(); |
+ (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions; |
+ } |
+ |
+ Action OnSendRtp(const uint8_t* packet, size_t length) override { |
+ RTPHeader header; |
+ EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
+ EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
+ // Unwrap packet id and verify uniqueness. |
+ int64_t packet_id = |
+ unwrapper_.Unwrap(header.extension.transportSequenceNumber); |
+ EXPECT_TRUE(received_packet_ids_.insert(packet_id).second); |
+ |
+ if (header.ssrc == kVideoSendSsrcs[0]) |
+ video_observed_ = true; |
+ if (header.ssrc == kAudioSendSsrc) |
+ audio_observed_ = true; |
+ if (audio_observed_ && video_observed_ && |
+ received_packet_ids_.size() == 50) { |
+ size_t packet_id_range = |
+ *received_packet_ids_.rbegin() - *received_packet_ids_.begin() + 1; |
+ EXPECT_EQ(received_packet_ids_.size(), packet_id_range); |
+ observation_complete_.Set(); |
+ } |
+ return SEND_PACKET; |
+ } |
+ |
+ void PerformTest() override { |
+ EXPECT_TRUE(Wait()) << "Timed out while waiting for audio and video " |
+ "packets with transport sequence number."; |
+ } |
+ |
+ private: |
+ bool video_observed_; |
+ bool audio_observed_; |
+ SequenceNumberUnwrapper unwrapper_; |
+ std::set<int64_t> received_packet_ids_; |
+ } test; |
+ |
+ RunBaseTest(&test, FakeNetworkPipe::Config()); |
+} |
} // namespace webrtc |