From 0ccae135562ac180da053fcecda91a0365621f14 Mon Sep 17 00:00:00 2001 From: Fredrik Solenberg Date: Tue, 3 Nov 2015 10:15:49 +0100 Subject: Changed FakeVoiceEngine into a MockVoiceEngine. BUG=webrtc:4690 R=tommi@webrtc.org Review URL: https://codereview.webrtc.org/1402403008 . Cr-Commit-Position: refs/heads/master@{#10491} --- webrtc/audio/audio_receive_stream_unittest.cc | 144 +++++++++++++++++--------- 1 file changed, 93 insertions(+), 51 deletions(-) (limited to '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 4e267f1738..0bb9b51e16 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -14,12 +14,15 @@ #include "webrtc/audio/conversion.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/fake_voice_engine.h" +#include "webrtc/test/mock_voice_engine.h" +namespace webrtc { +namespace test { namespace { -using webrtc::ByteWriter; - +const int kChannelId = 2; +const uint32_t kRemoteSsrc = 1234; +const uint32_t kLocalSsrc = 5678; const size_t kAbsoluteSendTimeLength = 4; void BuildAbsoluteSendTimeExtension(uint8_t* buffer, @@ -58,39 +61,38 @@ size_t CreateRtpHeaderWithAbsSendTime(uint8_t* header, } } // namespace -namespace webrtc { -namespace test { - TEST(AudioReceiveStreamTest, ConfigToString) { const int kAbsSendTimeId = 3; AudioReceiveStream::Config config; - config.rtp.remote_ssrc = 1234; - config.rtp.local_ssrc = 5678; + config.rtp.remote_ssrc = kRemoteSsrc; + config.rtp.local_ssrc = kLocalSsrc; config.rtp.extensions.push_back( RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); - config.voe_channel_id = 1; + config.voe_channel_id = kChannelId; config.combined_audio_video_bwe = true; - EXPECT_EQ("{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: " + EXPECT_EQ( + "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: " "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}]}, " "receive_transport: nullptr, rtcp_send_transport: nullptr, " - "voe_channel_id: 1, combined_audio_video_bwe: true}", config.ToString()); + "voe_channel_id: 2, combined_audio_video_bwe: true}", + config.ToString()); } TEST(AudioReceiveStreamTest, ConstructDestruct) { MockRemoteBitrateEstimator remote_bitrate_estimator; - FakeVoiceEngine voice_engine; + MockVoiceEngine voice_engine; AudioReceiveStream::Config config; - config.voe_channel_id = 1; + config.voe_channel_id = kChannelId; internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, &voice_engine); } TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { MockRemoteBitrateEstimator remote_bitrate_estimator; - FakeVoiceEngine voice_engine; + MockVoiceEngine voice_engine; AudioReceiveStream::Config config; config.combined_audio_video_bwe = true; - config.voe_channel_id = FakeVoiceEngine::kRecvChannelId; + config.voe_channel_id = kChannelId; const int kAbsSendTimeId = 3; config.rtp.extensions.push_back( RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); @@ -102,60 +104,100 @@ TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { PacketTime packet_time(5678000, 0); const size_t kExpectedHeaderLength = 20; EXPECT_CALL(remote_bitrate_estimator, - IncomingPacket(packet_time.timestamp / 1000, - sizeof(rtp_packet) - kExpectedHeaderLength, testing::_, false)) + IncomingPacket(packet_time.timestamp / 1000, + sizeof(rtp_packet) - kExpectedHeaderLength, + testing::_, false)) .Times(1); EXPECT_TRUE( recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); } TEST(AudioReceiveStreamTest, GetStats) { + const int kJitterBufferDelay = -7; + const int kPlayoutBufferDelay = 302; + const unsigned int kSpeechOutputLevel = 99; + const CallStatistics kCallStats = {345, 678, 901, 234, -12, + 3456, 7890, 567, 890, 123}; + + const CodecInst kCodecInst = {123, "codec_name_recv", 96000, -187, -198, + -103}; + + const NetworkStatistics kNetworkStats = { + 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; + + webrtc::AudioDecodingCallStats audio_decode_stats; + { + audio_decode_stats.calls_to_silence_generator = 234; + audio_decode_stats.calls_to_neteq = 567; + audio_decode_stats.decoded_normal = 890; + audio_decode_stats.decoded_plc = 123; + audio_decode_stats.decoded_cng = 456; + audio_decode_stats.decoded_plc_cng = 789; + } + MockRemoteBitrateEstimator remote_bitrate_estimator; - FakeVoiceEngine voice_engine; + MockVoiceEngine voice_engine; AudioReceiveStream::Config config; - config.rtp.remote_ssrc = FakeVoiceEngine::kRecvSsrc; - config.voe_channel_id = FakeVoiceEngine::kRecvChannelId; + config.rtp.remote_ssrc = kRemoteSsrc; + config.voe_channel_id = kChannelId; internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, &voice_engine); + using testing::_; + using testing::DoAll; + using testing::Return; + using testing::SetArgPointee; + using testing::SetArgReferee; + EXPECT_CALL(voice_engine, GetRemoteSSRC(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(0), Return(0))); + EXPECT_CALL(voice_engine, GetRTCPStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); + EXPECT_CALL(voice_engine, GetRecCodec(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); + EXPECT_CALL(voice_engine, GetDelayEstimate(kChannelId, _, _)) + .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay), + SetArgPointee<2>(kPlayoutBufferDelay), Return(0))); + EXPECT_CALL(voice_engine, GetSpeechOutputLevelFullRange(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0))); + EXPECT_CALL(voice_engine, GetNetworkStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0))); + EXPECT_CALL(voice_engine, GetDecodingCallStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgPointee<1>(audio_decode_stats), Return(0))); + AudioReceiveStream::Stats stats = recv_stream.GetStats(); - const CallStatistics& call_stats = FakeVoiceEngine::kRecvCallStats; - const CodecInst& codec_inst = FakeVoiceEngine::kRecvCodecInst; - const NetworkStatistics& net_stats = FakeVoiceEngine::kRecvNetworkStats; - const AudioDecodingCallStats& decode_stats = - FakeVoiceEngine::kRecvAudioDecodingCallStats; - EXPECT_EQ(FakeVoiceEngine::kRecvSsrc, stats.remote_ssrc); - EXPECT_EQ(static_cast(call_stats.bytesReceived), stats.bytes_rcvd); - EXPECT_EQ(static_cast(call_stats.packetsReceived), + EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); + EXPECT_EQ(static_cast(kCallStats.bytesReceived), stats.bytes_rcvd); + EXPECT_EQ(static_cast(kCallStats.packetsReceived), stats.packets_rcvd); - EXPECT_EQ(call_stats.cumulativeLost, stats.packets_lost); - EXPECT_EQ(Q8ToFloat(call_stats.fractionLost), stats.fraction_lost); - EXPECT_EQ(std::string(codec_inst.plname), stats.codec_name); - EXPECT_EQ(call_stats.extendedMax, stats.ext_seqnum); - EXPECT_EQ(call_stats.jitterSamples / (codec_inst.plfreq / 1000), + EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost); + EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost); + EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name); + EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum); + EXPECT_EQ(kCallStats.jitterSamples / (kCodecInst.plfreq / 1000), stats.jitter_ms); - EXPECT_EQ(net_stats.currentBufferSize, stats.jitter_buffer_ms); - EXPECT_EQ(net_stats.preferredBufferSize, stats.jitter_buffer_preferred_ms); - EXPECT_EQ(static_cast(FakeVoiceEngine::kRecvJitterBufferDelay + - FakeVoiceEngine::kRecvPlayoutBufferDelay), stats.delay_estimate_ms); - EXPECT_EQ(static_cast(FakeVoiceEngine::kRecvSpeechOutputLevel), - stats.audio_level); - EXPECT_EQ(Q14ToFloat(net_stats.currentExpandRate), stats.expand_rate); - EXPECT_EQ(Q14ToFloat(net_stats.currentSpeechExpandRate), + EXPECT_EQ(kNetworkStats.currentBufferSize, stats.jitter_buffer_ms); + EXPECT_EQ(kNetworkStats.preferredBufferSize, + stats.jitter_buffer_preferred_ms); + EXPECT_EQ(static_cast(kJitterBufferDelay + kPlayoutBufferDelay), + stats.delay_estimate_ms); + EXPECT_EQ(static_cast(kSpeechOutputLevel), stats.audio_level); + EXPECT_EQ(Q14ToFloat(kNetworkStats.currentExpandRate), stats.expand_rate); + EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSpeechExpandRate), stats.speech_expand_rate); - EXPECT_EQ(Q14ToFloat(net_stats.currentSecondaryDecodedRate), + EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDecodedRate), stats.secondary_decoded_rate); - EXPECT_EQ(Q14ToFloat(net_stats.currentAccelerateRate), stats.accelerate_rate); - EXPECT_EQ(Q14ToFloat(net_stats.currentPreemptiveRate), + EXPECT_EQ(Q14ToFloat(kNetworkStats.currentAccelerateRate), + stats.accelerate_rate); + EXPECT_EQ(Q14ToFloat(kNetworkStats.currentPreemptiveRate), stats.preemptive_expand_rate); - EXPECT_EQ(decode_stats.calls_to_silence_generator, + EXPECT_EQ(audio_decode_stats.calls_to_silence_generator, stats.decoding_calls_to_silence_generator); - EXPECT_EQ(decode_stats.calls_to_neteq, stats.decoding_calls_to_neteq); - EXPECT_EQ(decode_stats.decoded_normal, stats.decoding_normal); - EXPECT_EQ(decode_stats.decoded_plc, stats.decoding_plc); - EXPECT_EQ(decode_stats.decoded_cng, stats.decoding_cng); - EXPECT_EQ(decode_stats.decoded_plc_cng, stats.decoding_plc_cng); - EXPECT_EQ(call_stats.capture_start_ntp_time_ms_, + EXPECT_EQ(audio_decode_stats.calls_to_neteq, stats.decoding_calls_to_neteq); + EXPECT_EQ(audio_decode_stats.decoded_normal, stats.decoding_normal); + EXPECT_EQ(audio_decode_stats.decoded_plc, stats.decoding_plc); + EXPECT_EQ(audio_decode_stats.decoded_cng, stats.decoding_cng); + EXPECT_EQ(audio_decode_stats.decoded_plc_cng, stats.decoding_plc_cng); + EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, stats.capture_start_ntp_time_ms); } } // namespace test -- cgit v1.2.3 From 566ef247b9779f6c9d0e7ec9eea6b037f4682c53 Mon Sep 17 00:00:00 2001 From: solenberg Date: Fri, 6 Nov 2015 15:34:49 -0800 Subject: Move VoiceEngineObserver into AudioSendStream so that we detect typing noises and return properly in GetStats(). BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1403363003 Cr-Commit-Position: refs/heads/master@{#10548} --- webrtc/audio/audio_receive_stream_unittest.cc | 167 ++++++++++++++------------ 1 file changed, 93 insertions(+), 74 deletions(-) (limited to '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 0bb9b51e16..755d634d56 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -20,10 +20,84 @@ namespace webrtc { namespace test { namespace { +AudioDecodingCallStats MakeAudioDecodeStatsForTest() { + AudioDecodingCallStats audio_decode_stats; + audio_decode_stats.calls_to_silence_generator = 234; + audio_decode_stats.calls_to_neteq = 567; + audio_decode_stats.decoded_normal = 890; + audio_decode_stats.decoded_plc = 123; + audio_decode_stats.decoded_cng = 456; + audio_decode_stats.decoded_plc_cng = 789; + return audio_decode_stats; +} + const int kChannelId = 2; const uint32_t kRemoteSsrc = 1234; const uint32_t kLocalSsrc = 5678; const size_t kAbsoluteSendTimeLength = 4; +const int kAbsSendTimeId = 3; +const int kJitterBufferDelay = -7; +const int kPlayoutBufferDelay = 302; +const unsigned int kSpeechOutputLevel = 99; +const CallStatistics kCallStats = { + 345, 678, 901, 234, -12, 3456, 7890, 567, 890, 123}; +const CodecInst kCodecInst = { + 123, "codec_name_recv", 96000, -187, -198, -103}; +const NetworkStatistics kNetworkStats = { + 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; +const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); + +struct ConfigHelper { + ConfigHelper() { + EXPECT_CALL(voice_engine_, + RegisterVoiceEngineObserver(testing::_)).WillOnce(testing::Return(0)); + EXPECT_CALL(voice_engine_, + DeRegisterVoiceEngineObserver()).WillOnce(testing::Return(0)); + AudioState::Config config; + config.voice_engine = &voice_engine_; + audio_state_ = AudioState::Create(config); + stream_config_.voe_channel_id = kChannelId; + stream_config_.rtp.local_ssrc = kLocalSsrc; + stream_config_.rtp.remote_ssrc = kRemoteSsrc; + } + + MockRemoteBitrateEstimator* remote_bitrate_estimator() { + return &remote_bitrate_estimator_; + } + AudioReceiveStream::Config& config() { return stream_config_; } + rtc::scoped_refptr audio_state() { return audio_state_; } + MockVoiceEngine& voice_engine() { return voice_engine_; } + + void SetupMockForGetStats() { + using testing::_; + using testing::DoAll; + using testing::Return; + using testing::SetArgPointee; + using testing::SetArgReferee; + EXPECT_CALL(voice_engine_, GetRemoteSSRC(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(0), Return(0))); + EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); + EXPECT_CALL(voice_engine_, GetRecCodec(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); + EXPECT_CALL(voice_engine_, GetDelayEstimate(kChannelId, _, _)) + .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay), + SetArgPointee<2>(kPlayoutBufferDelay), Return(0))); + EXPECT_CALL(voice_engine_, + GetSpeechOutputLevelFullRange(kChannelId, _)).WillOnce( + DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0))); + EXPECT_CALL(voice_engine_, GetNetworkStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0))); + EXPECT_CALL(voice_engine_, GetDecodingCallStatistics(kChannelId, _)) + .WillOnce(DoAll(SetArgPointee<1>(kAudioDecodeStats), Return(0))); + } + + private: + MockRemoteBitrateEstimator remote_bitrate_estimator_; + MockVoiceEngine voice_engine_; + rtc::scoped_refptr audio_state_; + AudioReceiveStream::Config stream_config_; +}; void BuildAbsoluteSendTimeExtension(uint8_t* buffer, int id, @@ -62,7 +136,6 @@ size_t CreateRtpHeaderWithAbsSendTime(uint8_t* header, } // namespace TEST(AudioReceiveStreamTest, ConfigToString) { - const int kAbsSendTimeId = 3; AudioReceiveStream::Config config; config.rtp.remote_ssrc = kRemoteSsrc; config.rtp.local_ssrc = kLocalSsrc; @@ -79,31 +152,24 @@ TEST(AudioReceiveStreamTest, ConfigToString) { } TEST(AudioReceiveStreamTest, ConstructDestruct) { - MockRemoteBitrateEstimator remote_bitrate_estimator; - MockVoiceEngine voice_engine; - AudioReceiveStream::Config config; - config.voe_channel_id = kChannelId; - internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, - &voice_engine); + ConfigHelper helper; + internal::AudioReceiveStream recv_stream( + helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); } TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { - MockRemoteBitrateEstimator remote_bitrate_estimator; - MockVoiceEngine voice_engine; - AudioReceiveStream::Config config; - config.combined_audio_video_bwe = true; - config.voe_channel_id = kChannelId; - const int kAbsSendTimeId = 3; - config.rtp.extensions.push_back( + ConfigHelper helper; + helper.config().combined_audio_video_bwe = true; + helper.config().rtp.extensions.push_back( RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); - internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, - &voice_engine); + internal::AudioReceiveStream recv_stream( + helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); uint8_t rtp_packet[30]; const int kAbsSendTimeValue = 1234; CreateRtpHeaderWithAbsSendTime(rtp_packet, kAbsSendTimeId, kAbsSendTimeValue); PacketTime packet_time(5678000, 0); const size_t kExpectedHeaderLength = 20; - EXPECT_CALL(remote_bitrate_estimator, + EXPECT_CALL(*helper.remote_bitrate_estimator(), IncomingPacket(packet_time.timestamp / 1000, sizeof(rtp_packet) - kExpectedHeaderLength, testing::_, false)) @@ -113,57 +179,10 @@ TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { } TEST(AudioReceiveStreamTest, GetStats) { - const int kJitterBufferDelay = -7; - const int kPlayoutBufferDelay = 302; - const unsigned int kSpeechOutputLevel = 99; - const CallStatistics kCallStats = {345, 678, 901, 234, -12, - 3456, 7890, 567, 890, 123}; - - const CodecInst kCodecInst = {123, "codec_name_recv", 96000, -187, -198, - -103}; - - const NetworkStatistics kNetworkStats = { - 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; - - webrtc::AudioDecodingCallStats audio_decode_stats; - { - audio_decode_stats.calls_to_silence_generator = 234; - audio_decode_stats.calls_to_neteq = 567; - audio_decode_stats.decoded_normal = 890; - audio_decode_stats.decoded_plc = 123; - audio_decode_stats.decoded_cng = 456; - audio_decode_stats.decoded_plc_cng = 789; - } - - MockRemoteBitrateEstimator remote_bitrate_estimator; - MockVoiceEngine voice_engine; - AudioReceiveStream::Config config; - config.rtp.remote_ssrc = kRemoteSsrc; - config.voe_channel_id = kChannelId; - internal::AudioReceiveStream recv_stream(&remote_bitrate_estimator, config, - &voice_engine); - - using testing::_; - using testing::DoAll; - using testing::Return; - using testing::SetArgPointee; - using testing::SetArgReferee; - EXPECT_CALL(voice_engine, GetRemoteSSRC(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(0), Return(0))); - EXPECT_CALL(voice_engine, GetRTCPStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); - EXPECT_CALL(voice_engine, GetRecCodec(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); - EXPECT_CALL(voice_engine, GetDelayEstimate(kChannelId, _, _)) - .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay), - SetArgPointee<2>(kPlayoutBufferDelay), Return(0))); - EXPECT_CALL(voice_engine, GetSpeechOutputLevelFullRange(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0))); - EXPECT_CALL(voice_engine, GetNetworkStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0))); - EXPECT_CALL(voice_engine, GetDecodingCallStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgPointee<1>(audio_decode_stats), Return(0))); - + ConfigHelper helper; + internal::AudioReceiveStream recv_stream( + helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); + helper.SetupMockForGetStats(); AudioReceiveStream::Stats stats = recv_stream.GetStats(); EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc); EXPECT_EQ(static_cast(kCallStats.bytesReceived), stats.bytes_rcvd); @@ -190,13 +209,13 @@ TEST(AudioReceiveStreamTest, GetStats) { stats.accelerate_rate); EXPECT_EQ(Q14ToFloat(kNetworkStats.currentPreemptiveRate), stats.preemptive_expand_rate); - EXPECT_EQ(audio_decode_stats.calls_to_silence_generator, + EXPECT_EQ(kAudioDecodeStats.calls_to_silence_generator, stats.decoding_calls_to_silence_generator); - EXPECT_EQ(audio_decode_stats.calls_to_neteq, stats.decoding_calls_to_neteq); - EXPECT_EQ(audio_decode_stats.decoded_normal, stats.decoding_normal); - EXPECT_EQ(audio_decode_stats.decoded_plc, stats.decoding_plc); - EXPECT_EQ(audio_decode_stats.decoded_cng, stats.decoding_cng); - EXPECT_EQ(audio_decode_stats.decoded_plc_cng, stats.decoding_plc_cng); + EXPECT_EQ(kAudioDecodeStats.calls_to_neteq, stats.decoding_calls_to_neteq); + EXPECT_EQ(kAudioDecodeStats.decoded_normal, stats.decoding_normal); + EXPECT_EQ(kAudioDecodeStats.decoded_plc, stats.decoding_plc); + EXPECT_EQ(kAudioDecodeStats.decoded_cng, stats.decoding_cng); + EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng); EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_, stats.capture_start_ntp_time_ms); } -- cgit v1.2.3 From 3a94154035fa16e4efd91125311f076b547c38b9 Mon Sep 17 00:00:00 2001 From: solenberg Date: Mon, 16 Nov 2015 07:34:50 -0800 Subject: Move some send stream configuration into webrtc::AudioSendStream. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1418503010 Cr-Commit-Position: refs/heads/master@{#10652} --- webrtc/audio/audio_receive_stream_unittest.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to '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 755d634d56..edd804fe51 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -20,6 +20,9 @@ namespace webrtc { namespace test { namespace { +using testing::_; +using testing::Return; + AudioDecodingCallStats MakeAudioDecodeStatsForTest() { AudioDecodingCallStats audio_decode_stats; audio_decode_stats.calls_to_silence_generator = 234; @@ -50,9 +53,9 @@ const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); struct ConfigHelper { ConfigHelper() { EXPECT_CALL(voice_engine_, - RegisterVoiceEngineObserver(testing::_)).WillOnce(testing::Return(0)); + RegisterVoiceEngineObserver(_)).WillOnce(Return(0)); EXPECT_CALL(voice_engine_, - DeRegisterVoiceEngineObserver()).WillOnce(testing::Return(0)); + DeRegisterVoiceEngineObserver()).WillOnce(Return(0)); AudioState::Config config; config.voice_engine = &voice_engine_; audio_state_ = AudioState::Create(config); @@ -69,9 +72,7 @@ struct ConfigHelper { MockVoiceEngine& voice_engine() { return voice_engine_; } void SetupMockForGetStats() { - using testing::_; using testing::DoAll; - using testing::Return; using testing::SetArgPointee; using testing::SetArgReferee; EXPECT_CALL(voice_engine_, GetRemoteSSRC(kChannelId, _)) @@ -94,7 +95,7 @@ struct ConfigHelper { private: MockRemoteBitrateEstimator remote_bitrate_estimator_; - MockVoiceEngine voice_engine_; + testing::StrictMock voice_engine_; rtc::scoped_refptr audio_state_; AudioReceiveStream::Config stream_config_; }; -- cgit v1.2.3 From 8b85de2ba1a8885b70bf9fe8beadc54c5c405335 Mon Sep 17 00:00:00 2001 From: solenberg Date: Mon, 16 Nov 2015 09:48:04 -0800 Subject: Converted a bunch of error checking in Audio[Receive|Send]Stream to RTC_CHECKs instead. They should never fail. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1442483003 Cr-Commit-Position: refs/heads/master@{#10654} --- webrtc/audio/audio_receive_stream_unittest.cc | 2 -- 1 file changed, 2 deletions(-) (limited to '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 edd804fe51..715b52a592 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -75,8 +75,6 @@ struct ConfigHelper { using testing::DoAll; using testing::SetArgPointee; using testing::SetArgReferee; - EXPECT_CALL(voice_engine_, GetRemoteSSRC(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(0), Return(0))); EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _)) .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); EXPECT_CALL(voice_engine_, GetRecCodec(kChannelId, _)) -- cgit v1.2.3 From 7add0584390dcfb236165a6472ede6c2a94eaeed Mon Sep 17 00:00:00 2001 From: solenberg Date: Fri, 20 Nov 2015 09:59:34 -0800 Subject: Move some receive stream configuration into webrtc::AudioReceiveStream. Simplify creation of VoE channels and Call streams in WVoMC. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1454073002 Cr-Commit-Position: refs/heads/master@{#10731} --- webrtc/audio/audio_receive_stream_unittest.cc | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to '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 715b52a592..5efd5b0e1c 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -38,7 +38,8 @@ const int kChannelId = 2; const uint32_t kRemoteSsrc = 1234; const uint32_t kLocalSsrc = 5678; const size_t kAbsoluteSendTimeLength = 4; -const int kAbsSendTimeId = 3; +const int kAbsSendTimeId = 2; +const int kAudioLevelId = 3; const int kJitterBufferDelay = -7; const int kPlayoutBufferDelay = 302; const unsigned int kSpeechOutputLevel = 99; @@ -59,10 +60,23 @@ struct ConfigHelper { AudioState::Config config; config.voice_engine = &voice_engine_; audio_state_ = AudioState::Create(config); + + EXPECT_CALL(voice_engine_, SetLocalSSRC(kChannelId, kLocalSsrc)) + .WillOnce(Return(0)); + EXPECT_CALL(voice_engine_, + SetReceiveAbsoluteSenderTimeStatus(kChannelId, true, kAbsSendTimeId)) + .WillOnce(Return(0)); + EXPECT_CALL(voice_engine_, + SetReceiveAudioLevelIndicationStatus(kChannelId, true, kAudioLevelId)) + .WillOnce(Return(0)); stream_config_.voe_channel_id = kChannelId; stream_config_.rtp.local_ssrc = kLocalSsrc; stream_config_.rtp.remote_ssrc = kRemoteSsrc; - } + stream_config_.rtp.extensions.push_back( + RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); + stream_config_.rtp.extensions.push_back( + RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId)); +} MockRemoteBitrateEstimator* remote_bitrate_estimator() { return &remote_bitrate_estimator_; @@ -144,7 +158,7 @@ TEST(AudioReceiveStreamTest, ConfigToString) { config.combined_audio_video_bwe = true; EXPECT_EQ( "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: " - "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}]}, " + "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 2}]}, " "receive_transport: nullptr, rtcp_send_transport: nullptr, " "voe_channel_id: 2, combined_audio_video_bwe: true}", config.ToString()); @@ -159,8 +173,6 @@ TEST(AudioReceiveStreamTest, ConstructDestruct) { TEST(AudioReceiveStreamTest, AudioPacketUpdatesBweWithTimestamp) { ConfigHelper helper; helper.config().combined_audio_video_bwe = true; - helper.config().rtp.extensions.push_back( - RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); internal::AudioReceiveStream recv_stream( helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); uint8_t rtp_packet[30]; -- cgit v1.2.3 From 13725089ef91f932b37b2447c3f05d9cd9f89984 Mon Sep 17 00:00:00 2001 From: solenberg Date: Wed, 25 Nov 2015 08:16:52 -0800 Subject: Open backdoor in VoiceEngineImpl to get at the actual voe::Channel objects from an ID. This will allow Audio[Send|Receive]Stream to bypass the VoE interfaces in many cases and talk directly to the channel. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1459083007 Cr-Commit-Position: refs/heads/master@{#10788} --- webrtc/audio/audio_receive_stream_unittest.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to '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 5efd5b0e1c..aac7c0f1c1 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -14,6 +14,7 @@ #include "webrtc/audio/conversion.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" namespace webrtc { @@ -53,6 +54,8 @@ const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); struct ConfigHelper { ConfigHelper() { + using testing::Invoke; + EXPECT_CALL(voice_engine_, RegisterVoiceEngineObserver(_)).WillOnce(Return(0)); EXPECT_CALL(voice_engine_, @@ -61,8 +64,13 @@ struct ConfigHelper { config.voice_engine = &voice_engine_; audio_state_ = AudioState::Create(config); - EXPECT_CALL(voice_engine_, SetLocalSSRC(kChannelId, kLocalSsrc)) - .WillOnce(Return(0)); + EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId)) + .WillOnce(Invoke([this](int channel_id) { + EXPECT_FALSE(channel_proxy_); + channel_proxy_ = new testing::StrictMock(); + EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1); + return channel_proxy_; + })); EXPECT_CALL(voice_engine_, SetReceiveAbsoluteSenderTimeStatus(kChannelId, true, kAbsSendTimeId)) .WillOnce(Return(0)); @@ -76,7 +84,7 @@ struct ConfigHelper { RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId)); stream_config_.rtp.extensions.push_back( RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId)); -} + } MockRemoteBitrateEstimator* remote_bitrate_estimator() { return &remote_bitrate_estimator_; @@ -89,6 +97,7 @@ struct ConfigHelper { using testing::DoAll; using testing::SetArgPointee; using testing::SetArgReferee; + EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _)) .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); EXPECT_CALL(voice_engine_, GetRecCodec(kChannelId, _)) @@ -110,6 +119,7 @@ struct ConfigHelper { testing::StrictMock voice_engine_; rtc::scoped_refptr audio_state_; AudioReceiveStream::Config stream_config_; + testing::StrictMock* channel_proxy_ = nullptr; }; void BuildAbsoluteSendTimeExtension(uint8_t* buffer, -- cgit v1.2.3 From 358057b945725390bcecc330513160aa823f651e Mon Sep 17 00:00:00 2001 From: solenberg Date: Fri, 27 Nov 2015 10:46:42 -0800 Subject: Use ChannelProxy for most calls on voe::Channel in Audio[Receive|Send]Stream. BUG=webrtc:4690 Review URL: https://codereview.webrtc.org/1482703002 Cr-Commit-Position: refs/heads/master@{#10828} --- webrtc/audio/audio_receive_stream_unittest.cc | 37 +++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) (limited to '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 aac7c0f1c1..40c2d64970 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -69,14 +69,14 @@ struct ConfigHelper { EXPECT_FALSE(channel_proxy_); channel_proxy_ = new testing::StrictMock(); EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1); + EXPECT_CALL(*channel_proxy_, + SetReceiveAbsoluteSenderTimeStatus(true, kAbsSendTimeId)) + .Times(1); + EXPECT_CALL(*channel_proxy_, + SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId)) + .Times(1); return channel_proxy_; })); - EXPECT_CALL(voice_engine_, - SetReceiveAbsoluteSenderTimeStatus(kChannelId, true, kAbsSendTimeId)) - .WillOnce(Return(0)); - EXPECT_CALL(voice_engine_, - SetReceiveAudioLevelIndicationStatus(kChannelId, true, kAudioLevelId)) - .WillOnce(Return(0)); stream_config_.voe_channel_id = kChannelId; stream_config_.rtp.local_ssrc = kLocalSsrc; stream_config_.rtp.remote_ssrc = kRemoteSsrc; @@ -95,23 +95,22 @@ struct ConfigHelper { void SetupMockForGetStats() { using testing::DoAll; - using testing::SetArgPointee; using testing::SetArgReferee; - EXPECT_CALL(voice_engine_, GetRTCPStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kCallStats), Return(0))); + EXPECT_TRUE(channel_proxy_); + EXPECT_CALL(*channel_proxy_, GetRTCPStatistics()) + .WillOnce(Return(kCallStats)); + EXPECT_CALL(*channel_proxy_, GetDelayEstimate()) + .WillOnce(Return(kJitterBufferDelay + kPlayoutBufferDelay)); + EXPECT_CALL(*channel_proxy_, GetSpeechOutputLevelFullRange()) + .WillOnce(Return(kSpeechOutputLevel)); + EXPECT_CALL(*channel_proxy_, GetNetworkStatistics()) + .WillOnce(Return(kNetworkStats)); + EXPECT_CALL(*channel_proxy_, GetDecodingCallStatistics()) + .WillOnce(Return(kAudioDecodeStats)); + EXPECT_CALL(voice_engine_, GetRecCodec(kChannelId, _)) .WillOnce(DoAll(SetArgReferee<1>(kCodecInst), Return(0))); - EXPECT_CALL(voice_engine_, GetDelayEstimate(kChannelId, _, _)) - .WillOnce(DoAll(SetArgPointee<1>(kJitterBufferDelay), - SetArgPointee<2>(kPlayoutBufferDelay), Return(0))); - EXPECT_CALL(voice_engine_, - GetSpeechOutputLevelFullRange(kChannelId, _)).WillOnce( - DoAll(SetArgReferee<1>(kSpeechOutputLevel), Return(0))); - EXPECT_CALL(voice_engine_, GetNetworkStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgReferee<1>(kNetworkStats), Return(0))); - EXPECT_CALL(voice_engine_, GetDecodingCallStatistics(kChannelId, _)) - .WillOnce(DoAll(SetArgPointee<1>(kAudioDecodeStats), Return(0))); } private: -- cgit v1.2.3 From ea07373a2eb46f2732a8b5acef06a9b5078f37f8 Mon Sep 17 00:00:00 2001 From: Fredrik Solenberg Date: Tue, 1 Dec 2015 11:26:34 +0100 Subject: Enable cpplint for webrtc/audio and webrtc/call, and fix all uncovered cpplint errors. BUG=webrtc:5268,webrtc:5273 TESTED=Fixed issues reported by: find webrtc/audio -type f -name *.cc -o -name *.h | xargs cpplint.py find webrtc/call -type f -name *.cc -o -name *.h | xargs cpplint.py followed by 'git cl presubmit'. R=kjellander@webrtc.org, pbos@webrtc.org Review URL: https://codereview.webrtc.org/1483323002 . Cr-Commit-Position: refs/heads/master@{#10853} --- webrtc/audio/audio_receive_stream_unittest.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to '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 40c2d64970..bfd8dcaa33 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -8,6 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include + #include "testing/gtest/include/gtest/gtest.h" #include "webrtc/audio/audio_receive_stream.h" -- cgit v1.2.3 From 25702cb1628941427fa55e528f53483f239ae011 Mon Sep 17 00:00:00 2001 From: pkasting Date: Fri, 8 Jan 2016 13:50:27 -0800 Subject: Misc. small cleanups. * Better param names * Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases. * Use arraysize() * Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers * reinterpret_cast(void*) is not necessarily safe; use uintptr_t instead * Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition * Fix indenting * Use uint32_t for timestamps (matching how it's already a uint32_t in most places) * Spelling * RTC_CHECK_EQ(expected, actual) * Rewrap * Use .empty() * Be more pedantic about matching int/int32_t/ * Remove pointless consts on input parameters to functions * Add missing sanity checks All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first. BUG=none TEST=none Review URL: https://codereview.webrtc.org/1534193008 Cr-Commit-Position: refs/heads/master@{#11191} --- webrtc/audio/audio_receive_stream_unittest.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '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 bfd8dcaa33..01e8a2b76f 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -49,7 +49,7 @@ const unsigned int kSpeechOutputLevel = 99; const CallStatistics kCallStats = { 345, 678, 901, 234, -12, 3456, 7890, 567, 890, 123}; const CodecInst kCodecInst = { - 123, "codec_name_recv", 96000, -187, -198, -103}; + 123, "codec_name_recv", 96000, -187, 0, -103}; const NetworkStatistics kNetworkStats = { 123, 456, false, 0, 0, 789, 12, 345, 678, 901, -1, -1, -1, -1, -1, 0}; const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); -- cgit v1.2.3 From 3842c5c7f73639527e653f41c65334245d2317a1 Mon Sep 17 00:00:00 2001 From: Stefan Holmer Date: Tue, 12 Jan 2016 13:55:00 +0100 Subject: Wire-up BWE feedback for audio receive streams. Also wires up receiving transport sequence numbers. BUG=webrtc:5263 R=mflodman@webrtc.org, pbos@webrtc.org, solenberg@webrtc.org Review URL: https://codereview.webrtc.org/1535963002 . Cr-Commit-Position: refs/heads/master@{#11220} --- webrtc/audio/audio_receive_stream_unittest.cc | 155 ++++++++++++++++++++------ 1 file changed, 119 insertions(+), 36 deletions(-) (limited to '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 01e8a2b76f..eb008b3045 100644 --- a/webrtc/audio/audio_receive_stream_unittest.cc +++ b/webrtc/audio/audio_receive_stream_unittest.cc @@ -14,10 +14,16 @@ #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/modules/utility/include/mock/mock_process_thread.h" +#include "webrtc/system_wrappers/include/clock.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 +46,11 @@ AudioDecodingCallStats MakeAudioDecodeStatsForTest() { const int kChannelId = 2; const uint32_t kRemoteSsrc = 1234; const uint32_t kLocalSsrc = 5678; -const size_t kAbsoluteSendTimeLength = 4; +const size_t kOneByteExtensionHeaderLength = 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 +63,12 @@ const NetworkStatistics kNetworkStats = { const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest(); struct ConfigHelper { - ConfigHelper() { + ConfigHelper() + : simulated_clock_(123456), + call_stats_(&simulated_clock_), + congestion_controller_(&process_thread_, + &call_stats_, + &bitrate_observer_) { using testing::Invoke; EXPECT_CALL(voice_engine_, @@ -77,6 +90,14 @@ struct ConfigHelper { EXPECT_CALL(*channel_proxy_, SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId)) .Times(1); + EXPECT_CALL(*channel_proxy_, SetCongestionControlObjects( + nullptr, nullptr, &packet_router_)) + .Times(1); + EXPECT_CALL(congestion_controller_, packet_router()) + .WillOnce(Return(&packet_router_)); + EXPECT_CALL(*channel_proxy_, + SetCongestionControlObjects(nullptr, nullptr, nullptr)) + .Times(1); return channel_proxy_; })); stream_config_.voe_channel_id = kChannelId; @@ -88,6 +109,9 @@ struct ConfigHelper { RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId)); } + MockCongestionController* congestion_controller() { + return &congestion_controller_; + } MockRemoteBitrateEstimator* remote_bitrate_estimator() { return &remote_bitrate_estimator_; } @@ -95,11 +119,19 @@ struct ConfigHelper { rtc::scoped_refptr audio_state() { return audio_state_; } MockVoiceEngine& voice_engine() { return voice_engine_; } + void SetupMockForBweFeedback(bool send_side_bwe) { + EXPECT_CALL(congestion_controller_, + GetRemoteBitrateEstimator(send_side_bwe)) + .WillOnce(Return(&remote_bitrate_estimator_)); + EXPECT_CALL(remote_bitrate_estimator_, + RemoveStream(stream_config_.rtp.remote_ssrc)); + } + 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 +148,12 @@ struct ConfigHelper { } private: + SimulatedClock simulated_clock_; + CallStats call_stats_; + PacketRouter packet_router_; + testing::NiceMock bitrate_observer_; + testing::NiceMock process_thread_; + MockCongestionController congestion_controller_; MockRemoteBitrateEstimator remote_bitrate_estimator_; testing::StrictMock voice_engine_; rtc::scoped_refptr audio_state_; @@ -123,39 +161,43 @@ struct ConfigHelper { testing::StrictMock* channel_proxy_ = nullptr; }; -void BuildAbsoluteSendTimeExtension(uint8_t* buffer, - int id, - uint32_t abs_send_time) { - const size_t kRtpOneByteHeaderLength = 4; +void BuildOneByteExtension(std::vector::iterator it, + int id, + uint32_t extension_value, + size_t value_length) { const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; - ByteWriter::WriteBigEndian(buffer, kRtpOneByteHeaderExtensionId); - - const uint32_t kPosLength = 2; - ByteWriter::WriteBigEndian(buffer + kPosLength, - kAbsoluteSendTimeLength / 4); + ByteWriter::WriteBigEndian(&(*it), kRtpOneByteHeaderExtensionId); + it += 2; - const uint8_t kLengthOfData = 3; - buffer[kRtpOneByteHeaderLength] = (id << 4) + (kLengthOfData - 1); - ByteWriter::WriteBigEndian( - buffer + kRtpOneByteHeaderLength + 1, abs_send_time); + ByteWriter::WriteBigEndian(&(*it), kOneByteExtensionLength / 4); + it += 2; + const size_t kExtensionDataLength = kOneByteExtensionLength - 1; + uint32_t shifted_value = extension_value + << (8 * (kExtensionDataLength - value_length)); + *it = (id << 4) + (value_length - 1); + ++it; + ByteWriter::WriteBigEndian(&(*it), + shifted_value); } -size_t CreateRtpHeaderWithAbsSendTime(uint8_t* header, - int extension_id, - uint32_t abs_send_time) { +std::vector CreateRtpHeaderWithOneByteExtension( + int extension_id, + uint32_t extension_value, + size_t value_length) { + std::vector header; + header.resize(webrtc::kRtpHeaderSize + kOneByteExtensionHeaderLength + + kOneByteExtensionLength); header[0] = 0x80; // Version 2. header[0] |= 0x10; // Set extension bit. header[1] = 100; // Payload type. header[1] |= 0x80; // Marker bit is set. - ByteWriter::WriteBigEndian(header + 2, 0x1234); // Sequence number. - ByteWriter::WriteBigEndian(header + 4, 0x5678); // Timestamp. - ByteWriter::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; - return rtp_header_length; + ByteWriter::WriteBigEndian(&header[2], 0x1234); // Sequence number. + ByteWriter::WriteBigEndian(&header[4], 0x5678); // Timestamp. + ByteWriter::WriteBigEndian(&header[8], 0x4321); // SSRC. + + BuildOneByteExtension(header.begin() + webrtc::kRtpHeaderSize, extension_id, + extension_value, value_length); + return header; } } // namespace @@ -178,32 +220,73 @@ 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; + helper.SetupMockForBweFeedback(false); internal::AudioReceiveStream recv_stream( - helper.remote_bitrate_estimator(), helper.config(), helper.audio_state()); - uint8_t rtp_packet[30]; + helper.congestion_controller(), helper.config(), helper.audio_state()); const int kAbsSendTimeValue = 1234; - CreateRtpHeaderWithAbsSendTime(rtp_packet, kAbsSendTimeId, kAbsSendTimeValue); + std::vector rtp_packet = + CreateRtpHeaderWithOneByteExtension(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, + rtp_packet.size() - kExpectedHeaderLength, + VerifyHeaderExtension(expected_extension), false)) + .Times(1); + EXPECT_TRUE( + recv_stream.DeliverRtp(&rtp_packet[0], rtp_packet.size(), 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(true); + internal::AudioReceiveStream recv_stream( + helper.congestion_controller(), helper.config(), helper.audio_state()); + const int kTransportSequenceNumberValue = 1234; + std::vector rtp_packet = CreateRtpHeaderWithOneByteExtension( + 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)) + rtp_packet.size() - kExpectedHeaderLength, + VerifyHeaderExtension(expected_extension), false)) .Times(1); EXPECT_TRUE( - recv_stream.DeliverRtp(rtp_packet, sizeof(rtp_packet), packet_time)); + recv_stream.DeliverRtp(&rtp_packet[0], rtp_packet.size(), packet_time)); } 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); -- cgit v1.2.3