diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc index 58eca4f006..a6c81fc12d 100644 --- a/audio/audio_receive_stream.cc +++ b/audio/audio_receive_stream.cc @@ -239,6 +239,16 @@ void AudioReceiveStream::SetGain(float gain) { channel_receive_->SetChannelOutputVolumeScaling(gain); } +bool AudioReceiveStream::SetBaseMinimumPlayoutDelayMs(int delay_ms) { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + return channel_receive_->SetBaseMinimumPlayoutDelayMs(delay_ms); +} + +int AudioReceiveStream::GetBaseMinimumPlayoutDelayMs() const { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + return channel_receive_->GetBaseMinimumPlayoutDelayMs(); +} + std::vector AudioReceiveStream::GetSources() const { RTC_DCHECK_RUN_ON(&worker_thread_checker_); return channel_receive_->GetSources(); diff --git a/audio/audio_receive_stream.h b/audio/audio_receive_stream.h index 6596cb4644..b6d0aa5fa0 100644 --- a/audio/audio_receive_stream.h +++ b/audio/audio_receive_stream.h @@ -64,6 +64,8 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream, webrtc::AudioReceiveStream::Stats GetStats() const override; void SetSink(AudioSinkInterface* sink) override; void SetGain(float gain) override; + bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override; + int GetBaseMinimumPlayoutDelayMs() const override; std::vector GetSources() const override; // TODO(nisse): We don't formally implement RtpPacketSinkInterface, and this diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc index 9c8aaa6416..b899dcf43f 100644 --- a/audio/channel_receive.cc +++ b/audio/channel_receive.cc @@ -144,6 +144,10 @@ class ChannelReceive : public ChannelReceiveInterface, void SetMinimumPlayoutDelay(int delayMs) override; uint32_t GetPlayoutTimestamp() const override; + // Audio quality. + bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override; + int GetBaseMinimumPlayoutDelayMs() const override; + // Produces the transport-related timestamps; current_delay_ms is left unset. absl::optional GetSyncInfo() const override; @@ -865,6 +869,14 @@ uint32_t ChannelReceive::GetPlayoutTimestamp() const { } } +bool ChannelReceive::SetBaseMinimumPlayoutDelayMs(int delay_ms) { + return audio_coding_->SetBaseMinimumPlayoutDelayMs(delay_ms); +} + +int ChannelReceive::GetBaseMinimumPlayoutDelayMs() const { + return audio_coding_->GetBaseMinimumPlayoutDelayMs(); +} + absl::optional ChannelReceive::GetSyncInfo() const { RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread()); Syncable::Info info; diff --git a/audio/channel_receive.h b/audio/channel_receive.h index d93ddadffc..28c7c06567 100644 --- a/audio/channel_receive.h +++ b/audio/channel_receive.h @@ -102,6 +102,12 @@ class ChannelReceiveInterface : public RtpPacketSinkInterface { virtual void SetMinimumPlayoutDelay(int delay_ms) = 0; virtual uint32_t GetPlayoutTimestamp() const = 0; + // Audio quality. + // Base minimum delay sets lower bound on minimum delay value which + // determines minimum delay until audio playout. + virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0; + virtual int GetBaseMinimumPlayoutDelayMs() const = 0; + // Produces the transport-related timestamps; current_delay_ms is left unset. virtual absl::optional GetSyncInfo() const = 0; diff --git a/audio/mock_voe_channel_proxy.h b/audio/mock_voe_channel_proxy.h index 3aa9bf1eab..4aea1315e0 100644 --- a/audio/mock_voe_channel_proxy.h +++ b/audio/mock_voe_channel_proxy.h @@ -53,6 +53,8 @@ class MockChannelReceive : public voe::ChannelReceiveInterface { MOCK_CONST_METHOD0(GetPlayoutTimestamp, uint32_t()); MOCK_CONST_METHOD0(GetSyncInfo, absl::optional()); MOCK_METHOD1(SetMinimumPlayoutDelay, void(int delay_ms)); + MOCK_METHOD1(SetBaseMinimumPlayoutDelayMs, bool(int delay_ms)); + MOCK_CONST_METHOD0(GetBaseMinimumPlayoutDelayMs, int()); MOCK_CONST_METHOD0(GetReceiveCodec, absl::optional>()); MOCK_METHOD1(SetReceiveCodecs, diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h index 88a16edb6d..64934b469a 100644 --- a/call/audio_receive_stream.h +++ b/call/audio_receive_stream.h @@ -164,6 +164,15 @@ class AudioReceiveStream { // is potentially forwarded to any attached AudioSinkInterface implementation. virtual void SetGain(float gain) = 0; + // Sets a base minimum for the playout delay. Base minimum delay sets lower + // bound on minimum delay value determining lower bound on playout delay. + // + // Returns true if value was successfully set, false overwise. + virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0; + + // Returns current value of base minimum delay in milliseconds. + virtual int GetBaseMinimumPlayoutDelayMs() const = 0; + virtual std::vector GetSources() const = 0; protected: diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h index 4e8aa039f6..a0147e9ee0 100644 --- a/media/engine/fake_webrtc_call.h +++ b/media/engine/fake_webrtc_call.h @@ -104,6 +104,13 @@ class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream { webrtc::AudioReceiveStream::Stats GetStats() const override; void SetSink(webrtc::AudioSinkInterface* sink) override; void SetGain(float gain) override; + bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override { + base_minimum_playout_delay_ms_ = delay_ms; + return true; + } + int GetBaseMinimumPlayoutDelayMs() const override { + return base_minimum_playout_delay_ms_; + } std::vector GetSources() const override { return std::vector(); } @@ -116,6 +123,7 @@ class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream { float gain_ = 1.0f; rtc::Buffer last_packet_; bool started_ = false; + int base_minimum_playout_delay_ms_ = 0; }; class FakeVideoSendStream final diff --git a/modules/audio_coding/acm2/audio_coding_module.cc b/modules/audio_coding/acm2/audio_coding_module.cc index 2ce768b85b..9e4ac89ac9 100644 --- a/modules/audio_coding/acm2/audio_coding_module.cc +++ b/modules/audio_coding/acm2/audio_coding_module.cc @@ -100,6 +100,10 @@ class AudioCodingModuleImpl final : public AudioCodingModule { // Maximum playout delay. int SetMaximumPlayoutDelay(int time_ms) override; + bool SetBaseMinimumPlayoutDelayMs(int delay_ms) override; + + int GetBaseMinimumPlayoutDelayMs() const override; + absl::optional PlayoutTimestamp() override; int FilteredCurrentDelayMs() const override; @@ -708,6 +712,15 @@ int AudioCodingModuleImpl::SetMaximumPlayoutDelay(int time_ms) { return receiver_.SetMaximumDelay(time_ms); } +bool AudioCodingModuleImpl::SetBaseMinimumPlayoutDelayMs(int delay_ms) { + // All necessary validation happens on NetEq level. + return receiver_.SetBaseMinimumDelayMs(delay_ms); +} + +int AudioCodingModuleImpl::GetBaseMinimumPlayoutDelayMs() const { + return receiver_.GetBaseMinimumDelayMs(); +} + // Get 10 milliseconds of raw audio data to play out. // Automatic resample to the requested frequency. int AudioCodingModuleImpl::PlayoutData10Ms(int desired_freq_hz, diff --git a/modules/audio_coding/include/audio_coding_module.h b/modules/audio_coding/include/audio_coding_module.h index 89c3b01b78..7d11d70a08 100644 --- a/modules/audio_coding/include/audio_coding_module.h +++ b/modules/audio_coding/include/audio_coding_module.h @@ -275,6 +275,15 @@ class AudioCodingModule { // virtual int SetMaximumPlayoutDelay(int time_ms) = 0; + // Sets a base minimum for the playout delay. Base minimum delay sets lower + // bound minimum delay value which is set via SetMinimumPlayoutDelay. + // + // Returns true if value was successfully set, false overwise. + virtual bool SetBaseMinimumPlayoutDelayMs(int delay_ms) = 0; + + // Returns current value of base minimum delay in milliseconds. + virtual int GetBaseMinimumPlayoutDelayMs() const = 0; + /////////////////////////////////////////////////////////////////////////// // int32_t PlayoutTimestamp() // The send timestamp of an RTP packet is associated with the decoded