Chromium Code Reviews| Index: webrtc/audio/audio_receive_stream_unittest.cc |
| diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc |
| index bfd8dcaa33f92435da627009382d42f80200289a..ab6a4a96e121519d58ca936e6f1a0e48eaa6d819 100644 |
| --- a/webrtc/audio/audio_receive_stream_unittest.cc |
| +++ b/webrtc/audio/audio_receive_stream_unittest.cc |
| @@ -14,10 +14,14 @@ |
| #include "webrtc/audio/audio_receive_stream.h" |
| #include "webrtc/audio/conversion.h" |
| +#include "webrtc/call/mock/mock_congestion_controller.h" |
| +#include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h" |
| +#include "webrtc/modules/pacing/packet_router.h" |
| #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h" |
| #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| #include "webrtc/test/mock_voe_channel_proxy.h" |
| #include "webrtc/test/mock_voice_engine.h" |
| +#include "webrtc/video/call_stats.h" |
| namespace webrtc { |
| namespace test { |
| @@ -40,9 +44,10 @@ AudioDecodingCallStats MakeAudioDecodeStatsForTest() { |
| const int kChannelId = 2; |
| const uint32_t kRemoteSsrc = 1234; |
| const uint32_t kLocalSsrc = 5678; |
| -const size_t kAbsoluteSendTimeLength = 4; |
| +const size_t kOneByteExtensionLength = 4; |
| const int kAbsSendTimeId = 2; |
| const int kAudioLevelId = 3; |
| +const int kTransportSequenceNumberId = 4; |
| const int kJitterBufferDelay = -7; |
| const int kPlayoutBufferDelay = 302; |
| const unsigned int kSpeechOutputLevel = 99; |
| @@ -55,7 +60,12 @@ const NetworkStatistics kNetworkStats = { |
| const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); |
| struct ConfigHelper { |
| - ConfigHelper() { |
| + ConfigHelper() |
| + : call_stats_(Clock::GetRealTimeClock()), |
|
the sun
2015/12/20 23:16:15
RealTimeClock? Can we run on simulated time instea
stefan-webrtc
2015/12/21 08:01:29
There is nothing stopping us, but I don't really s
the sun
2015/12/22 00:14:13
So we don't actually need a clock at all? Then we
|
| + process_thread_(ProcessThread::Create("AudioTestThread")), |
| + congestion_controller_(process_thread_.get(), |
| + &call_stats_, |
| + &bitrate_observer_) { |
| using testing::Invoke; |
| EXPECT_CALL(voice_engine_, |
| @@ -65,11 +75,10 @@ struct ConfigHelper { |
| AudioState::Config config; |
| config.voice_engine = &voice_engine_; |
| audio_state_ = AudioState::Create(config); |
| + channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>(); |
| EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId)) |
| .WillOnce(Invoke([this](int channel_id) { |
| - EXPECT_FALSE(channel_proxy_); |
| - channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>(); |
| EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1); |
| EXPECT_CALL(*channel_proxy_, |
| SetReceiveAbsoluteSenderTimeStatus(true, kAbsSendTimeId)) |
| @@ -88,6 +97,9 @@ struct ConfigHelper { |
| RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId)); |
| } |
| + MockCongestionController* congestion_controller() { |
| + return &congestion_controller_; |
| + } |
| MockRemoteBitrateEstimator* remote_bitrate_estimator() { |
| return &remote_bitrate_estimator_; |
| } |
| @@ -95,11 +107,27 @@ struct ConfigHelper { |
| rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; } |
| MockVoiceEngine& voice_engine() { return voice_engine_; } |
| + void SetupMockForBweFeedback() { |
| + EXPECT_CALL(congestion_controller_, GetRemoteBitrateEstimator(true)) |
| + .WillOnce(Return(&remote_bitrate_estimator_)); |
| + EXPECT_CALL(congestion_controller_, packet_router()) |
| + .WillOnce(Return(&packet_router_)); |
| + EXPECT_CALL(remote_bitrate_estimator_, |
| + RemoveStream(stream_config_.rtp.remote_ssrc)); |
| + ASSERT_TRUE(channel_proxy_); |
| + EXPECT_CALL(*channel_proxy_, |
| + SetCongestionControlObjects(nullptr, nullptr, &packet_router_)) |
| + .Times(1); |
| + EXPECT_CALL(*channel_proxy_, |
| + SetCongestionControlObjects(nullptr, nullptr, nullptr)) |
| + .Times(1); |
| + } |
| + |
| void SetupMockForGetStats() { |
| using testing::DoAll; |
| using testing::SetArgReferee; |
| - EXPECT_TRUE(channel_proxy_); |
| + ASSERT_TRUE(channel_proxy_); |
| EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) |
| .WillOnce(Return(kCallStats)); |
| EXPECT_CALL(*channel_proxy_, GetDelayEstimate()) |
| @@ -116,6 +144,11 @@ struct ConfigHelper { |
| } |
| private: |
| + CallStats call_stats_; |
| + PacketRouter packet_router_; |
| + testing::NiceMock<MockBitrateObserver> bitrate_observer_; |
| + rtc::scoped_ptr<ProcessThread> process_thread_; |
| + MockCongestionController congestion_controller_; |
| MockRemoteBitrateEstimator remote_bitrate_estimator_; |
| testing::StrictMock<MockVoiceEngine> voice_engine_; |
| rtc::scoped_refptr<AudioState> audio_state_; |
| @@ -123,26 +156,29 @@ struct ConfigHelper { |
| testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr; |
| }; |
| -void BuildAbsoluteSendTimeExtension(uint8_t* buffer, |
| - int id, |
| - uint32_t abs_send_time) { |
| +void BuildOneByteExtension(uint8_t* buffer, |
| + int id, |
| + uint32_t extension_value, |
| + size_t value_length) { |
| const size_t kRtpOneByteHeaderLength = 4; |
| const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; |
| ByteWriter<uint16_t>::WriteBigEndian(buffer, kRtpOneByteHeaderExtensionId); |
| const uint32_t kPosLength = 2; |
| ByteWriter<uint16_t>::WriteBigEndian(buffer + kPosLength, |
| - kAbsoluteSendTimeLength / 4); |
| - |
| - const uint8_t kLengthOfData = 3; |
| - buffer[kRtpOneByteHeaderLength] = (id << 4) + (kLengthOfData - 1); |
| - ByteWriter<uint32_t, kLengthOfData>::WriteBigEndian( |
| - buffer + kRtpOneByteHeaderLength + 1, abs_send_time); |
| + kOneByteExtensionLength / 4); |
| + const size_t kExtensionDataLength = kOneByteExtensionLength - 1; |
| + uint32_t shifted_value = extension_value |
| + << (8 * (kExtensionDataLength - value_length)); |
| + buffer[kRtpOneByteHeaderLength] = (id << 4) + (value_length - 1); |
| + ByteWriter<uint32_t, kExtensionDataLength>::WriteBigEndian( |
| + buffer + kRtpOneByteHeaderLength + 1, shifted_value); |
| } |
| -size_t CreateRtpHeaderWithAbsSendTime(uint8_t* header, |
| - int extension_id, |
| - uint32_t abs_send_time) { |
| +size_t CreateRtpHeaderWithOneByteExtension(uint8_t* header, |
| + int extension_id, |
| + uint32_t extension_value, |
| + size_t value_length) { |
| header[0] = 0x80; // Version 2. |
| header[0] |= 0x10; // Set extension bit. |
| header[1] = 100; // Payload type. |
| @@ -152,9 +188,9 @@ size_t CreateRtpHeaderWithAbsSendTime(uint8_t* header, |
| ByteWriter<uint32_t>::WriteBigEndian(header + 8, 0x4321); // SSRC. |
| int32_t rtp_header_length = webrtc::kRtpHeaderSize; |
| - BuildAbsoluteSendTimeExtension(header + rtp_header_length, extension_id, |
| - abs_send_time); |
| - rtp_header_length += kAbsoluteSendTimeLength; |
| + BuildOneByteExtension(header + rtp_header_length, extension_id, |
| + extension_value, value_length); |
| + rtp_header_length += kOneByteExtensionLength; |
| return rtp_header_length; |
| } |
| } // namespace |
| @@ -178,23 +214,69 @@ TEST(AudioReceiveStreamTest, ConfigToString) { |
| TEST(AudioReceiveStreamTest, ConstructDestruct) { |
| ConfigHelper helper; |
| internal::AudioReceiveStream recv_stream( |
| - helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); |
| + helper.congestion_controller(), helper.config(), helper.audio_state()); |
| +} |
| + |
| +MATCHER_P(VerifyHeaderExtension, expected_extension, "") { |
| + return arg.extension.hasAbsoluteSendTime == |
| + expected_extension.hasAbsoluteSendTime && |
| + arg.extension.absoluteSendTime == |
| + expected_extension.absoluteSendTime && |
| + arg.extension.hasTransportSequenceNumber == |
| + expected_extension.hasTransportSequenceNumber && |
| + arg.extension.transportSequenceNumber == |
| + expected_extension.transportSequenceNumber; |
| } |
| TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { |
| ConfigHelper helper; |
| helper.config().combined_audio_video_bwe = true; |
| + EXPECT_CALL(*helper.congestion_controller(), GetRemoteBitrateEstimator(false)) |
| + .WillOnce(Return(helper.remote_bitrate_estimator())); |
| + EXPECT_CALL(*helper.remote_bitrate_estimator(), |
| + RemoveStream(helper.config().rtp.remote_ssrc)); |
| internal::AudioReceiveStream recv_stream( |
| - helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); |
| + helper.congestion_controller(), helper.config(), helper.audio_state()); |
| uint8_t rtp_packet[30]; |
| const int kAbsSendTimeValue = 1234; |
| - CreateRtpHeaderWithAbsSendTime(rtp_packet, kAbsSendTimeId, kAbsSendTimeValue); |
| + CreateRtpHeaderWithOneByteExtension(rtp_packet, kAbsSendTimeId, |
| + kAbsSendTimeValue, 3); |
| + PacketTime packet_time(5678000, 0); |
| + const size_t kExpectedHeaderLength = 20; |
| + RTPHeaderExtension expected_extension; |
| + expected_extension.hasAbsoluteSendTime = true; |
| + expected_extension.absoluteSendTime = kAbsSendTimeValue; |
| + EXPECT_CALL(*helper.remote_bitrate_estimator(), |
| + IncomingPacket(packet_time.timestamp / 1000, |
| + sizeof(rtp_packet) - kExpectedHeaderLength, |
| + VerifyHeaderExtension(expected_extension), false)) |
| + .Times(1); |
| + EXPECT_TRUE( |
| + recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); |
| +} |
| + |
| +TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweFeedback) { |
| + ConfigHelper helper; |
| + helper.config().combined_audio_video_bwe = true; |
| + helper.config().rtp.transport_cc = true; |
| + helper.config().rtp.extensions.push_back(RtpExtension( |
| + RtpExtension::kTransportSequenceNumber, kTransportSequenceNumberId)); |
| + helper.SetupMockForBweFeedback(); |
| + internal::AudioReceiveStream recv_stream( |
| + helper.congestion_controller(), helper.config(), helper.audio_state()); |
| + uint8_t rtp_packet[30]; |
| + const int kTransportSequenceNumberValue = 1234; |
| + CreateRtpHeaderWithOneByteExtension(rtp_packet, kTransportSequenceNumberId, |
| + kTransportSequenceNumberValue, 2); |
| PacketTime packet_time(5678000, 0); |
| const size_t kExpectedHeaderLength = 20; |
| + RTPHeaderExtension expected_extension; |
| + expected_extension.hasTransportSequenceNumber = true; |
| + expected_extension.transportSequenceNumber = kTransportSequenceNumberValue; |
| EXPECT_CALL(*helper.remote_bitrate_estimator(), |
| IncomingPacket(packet_time.timestamp / 1000, |
| sizeof(rtp_packet) - kExpectedHeaderLength, |
| - testing::_, false)) |
| + VerifyHeaderExtension(expected_extension), false)) |
| .Times(1); |
| EXPECT_TRUE( |
| recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); |
| @@ -203,7 +285,7 @@ TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { |
| TEST(AudioReceiveStreamTest, GetStats) { |
| ConfigHelper helper; |
| internal::AudioReceiveStream recv_stream( |
| - helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); |
| + helper.congestion_controller(), helper.config(), helper.audio_state()); |
| helper.SetupMockForGetStats(); |
| AudioReceiveStream::Stats stats = recv_stream.GetStats(); |
| EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); |