Add callback for send codec in audio too

It turns out there's a similar linkage as the one for video.
Tests are coming in https://webrtc-review.googlesource.com/c/src/+/307461

Bug: webrtc:13931
Change-Id: I638d1a1907116a71481aa88dce932492323ae5b7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/307463
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40206}
This commit is contained in:
Harald Alvestrand 2023-06-02 09:59:45 +00:00 committed by WebRTC LUCI CQ
parent 371b7af673
commit 4ad141e69b
8 changed files with 48 additions and 6 deletions

View File

@ -420,6 +420,9 @@ class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
bool SenderNonSenderRttEnabled() const override { return false; }
void SetReceiveNackEnabled(bool enabled) {}
void SetReceiveNonSenderRttEnabled(bool enabled) {}
bool SendCodecHasNack() const override { return false; }
void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) override {}
private:
class VoiceChannelAudioSink : public AudioSource::Sink {

View File

@ -247,9 +247,14 @@ class MediaSendChannelInterface {
webrtc::VideoEncoderFactory::EncoderSelectorInterface* encoder_selector) {
}
virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const = 0;
virtual bool SendCodecHasNack() const = 0;
// Called whenever the list of sending SSRCs changes.
virtual void SetSsrcListChangedCallback(
absl::AnyInvocable<void(const std::set<uint32_t>&)> callback) = 0;
// TODO(bugs.webrtc.org/13931): Remove when configuration is more sensible
virtual void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) = 0;
// Get the underlying send/receive implementation channel for testing.
// TODO(bugs.webrtc.org/13931): Remove method and the fakes that depend on it.
virtual MediaChannel* ImplForTesting() = 0;
@ -952,11 +957,7 @@ class VideoMediaSendChannelInterface : public MediaSendChannelInterface {
// Information queries to support SetReceiverFeedbackParameters
virtual webrtc::RtcpMode SendCodecRtcpMode() const = 0;
virtual bool SendCodecHasLntf() const = 0;
virtual bool SendCodecHasNack() const = 0;
virtual absl::optional<int> SendCodecRtxTime() const = 0;
// TODO(bugs.webrtc.org/13931): Remove when configuration is more sensible
virtual void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) = 0;
};
class VideoMediaReceiveChannelInterface : public MediaReceiveChannelInterface {

View File

@ -206,6 +206,8 @@ class MediaChannel : public MediaChannelUtil,
void OnNetworkRouteChanged(absl::string_view transport_name,
const rtc::NetworkRoute& network_route) override =
0;
void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) override = 0;
// Methods from the APIs that are implemented in MediaChannelUtil
using MediaChannelUtil::ExtmapAllowMixed;
@ -469,6 +471,11 @@ class VoiceMediaSendChannel : public VoiceMediaSendChannelInterface {
bool SenderNonSenderRttEnabled() const override {
return impl_->SenderNonSenderRttEnabled();
}
bool SendCodecHasNack() const override { return impl()->SendCodecHasNack(); }
void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) override {
impl()->SetSendCodecChangedCallback(std::move(callback));
}
MediaChannel* ImplForTesting() override { return impl_; }
private:

View File

@ -1761,15 +1761,17 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
}
call_->GetTransportControllerSend()->SetSdpBitrateParameters(bitrate_config);
send_codecs_ = codecs;
// In legacy kBoth mode, the MediaChannel sets the NACK status.
// In other modes, this is done externally.
if (role() == MediaChannel::Role::kBoth) {
SetReceiveNackEnabled(send_codec_spec_->nack_enabled);
SetReceiveNonSenderRttEnabled(send_codec_spec_->enable_non_sender_rtt);
} else if (send_codec_changed_callback_) {
send_codec_changed_callback_();
}
send_codecs_ = codecs;
return true;
}

View File

@ -18,6 +18,7 @@
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
@ -304,9 +305,14 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
}
return send_codec_spec_->enable_non_sender_rtt;
}
bool SendCodecHasNack() const override { return SenderNackEnabled(); }
void SetReceiveNackEnabled(bool enabled) override;
void SetReceiveNonSenderRttEnabled(bool enabled) override;
void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) override {
send_codec_changed_callback_ = std::move(callback);
}
private:
bool SetOptions(const AudioOptions& options);
@ -404,6 +410,9 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
void FillSendCodecStats(VoiceMediaSendInfo* voice_media_info);
void FillReceiveCodecStats(VoiceMediaReceiveInfo* voice_media_info);
// Callback invoked whenever the send codec changes.
// TODO(bugs.webrtc.org/13931): Remove again when coupling isn't needed.
absl::AnyInvocable<void()> send_codec_changed_callback_;
// Callback invoked whenever the list of SSRCs changes.
absl::AnyInvocable<void(const std::set<uint32_t>&)>
ssrc_list_changed_callback_;

View File

@ -886,7 +886,9 @@ VoiceChannel::VoiceChannel(
crypto_options,
ssrc_generator),
send_channel_(media_channel_impl_->AsVoiceChannel()),
receive_channel_(media_channel_impl_->AsVoiceChannel()) {}
receive_channel_(media_channel_impl_->AsVoiceChannel()) {
InitCallback();
}
VoiceChannel::~VoiceChannel() {
TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel");
@ -894,6 +896,18 @@ VoiceChannel::~VoiceChannel() {
DisableMedia_w();
}
void VoiceChannel::InitCallback() {
RTC_DCHECK_RUN_ON(worker_thread());
// TODO(bugs.webrtc.org/13931): Remove when values are set
// in a more sensible fashion
send_channel_.SetSendCodecChangedCallback([this]() {
RTC_DCHECK_RUN_ON(worker_thread());
// Adjust receive streams based on send codec.
receive_channel_.SetReceiveNackEnabled(send_channel_.SendCodecHasNack());
receive_channel_.SetReceiveNonSenderRttEnabled(
send_channel_.SenderNonSenderRttEnabled());
});
}
void VoiceChannel::UpdateMediaSendRecvState_w() {
// Render incoming data if we're the active call, and we have the local
// content. We receive data on the default channel and multiplexed streams.

View File

@ -435,6 +435,7 @@ class VoiceChannel : public BaseChannel {
}
private:
void InitCallback();
// overrides from BaseChannel
void UpdateMediaSendRecvState_w() RTC_RUN_ON(worker_thread()) override;
bool SetLocalContent_w(const MediaContentDescription* content,

View File

@ -67,10 +67,15 @@ class MockVoiceMediaChannel : public VoiceMediaChannel {
ChooseReceiverReportSsrc,
(const std::set<uint32_t>&),
(override));
MOCK_METHOD(bool, SendCodecHasNack, (), (const, override));
MOCK_METHOD(void,
SetSsrcListChangedCallback,
(absl::AnyInvocable<void(const std::set<uint32_t>&)>),
(override));
MOCK_METHOD(void,
SetSendCodecChangedCallback,
(absl::AnyInvocable<void()>),
(override));
MOCK_METHOD(void, OnDemuxerCriteriaUpdatePending, (), (override));
MOCK_METHOD(void, OnDemuxerCriteriaUpdateComplete, (), (override));
MOCK_METHOD(int, GetRtpSendTimeExtnId, (), (const, override));