Apply the "shim" pattern for WebRtcVoiceEngine

This ensures that the MediaChannel interface is only implemented
through a send/receive shim, splitting channels also when kBoth is
used.

Bug: webrtc:13931
Change-Id: Ie97809597eaae7b4f504939339795432c34e56cb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/307461
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40210}
This commit is contained in:
Harald Alvestrand 2023-06-02 11:57:12 +00:00 committed by WebRTC LUCI CQ
parent b15a9f01fc
commit 9a34d80fc4
7 changed files with 356 additions and 53 deletions

View File

@ -834,6 +834,7 @@ if (rtc_include_tests) {
defines = []
deps = [
":codec",
":media_channel_shim",
":media_constants",
":rtc_audio_video",
":rtc_internal_video_codecs",

View File

@ -338,11 +338,23 @@ class VoiceMediaChannel : public MediaChannel,
return nullptr;
}
// Declared here to avoid "found in multiple base-class subobjects" error
// Declared here in order to avoid "found by multiple paths" compile error
bool AddSendStream(const StreamParams& sp) override = 0;
bool AddRecvStream(const StreamParams& sp) override = 0;
void OnPacketReceived(const webrtc::RtpPacketReceived& packet) override = 0;
void SetEncoderSelector(uint32_t ssrc,
webrtc::VideoEncoderFactory::EncoderSelectorInterface*
encoder_selector) override {}
void ChooseReceiverReportSsrc(const std::set<uint32_t>& choices) override = 0;
void SetSsrcListChangedCallback(
absl::AnyInvocable<void(const std::set<uint32_t>&)> callback) override =
0;
webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override = 0;
webrtc::RTCError SetRtpSendParameters(
uint32_t ssrc,
const webrtc::RtpParameters& parameters,
webrtc::SetParametersCallback callback = nullptr) override = 0;
void SetExtmapAllowMixed(bool mixed) override {
MediaChannel::SetExtmapAllowMixed(mixed);
}
@ -360,18 +372,16 @@ class VoiceMediaChannel : public MediaChannel,
virtual bool GetSendStats(VoiceMediaSendInfo* info) = 0;
virtual bool GetReceiveStats(VoiceMediaReceiveInfo* info,
bool get_and_clear_legacy_stats) = 0;
private:
// Functions not implemented on this interface
bool GetStats(VoiceMediaSendInfo* info) override {
RTC_CHECK_NOTREACHED();
return false;
return GetSendStats(info);
}
bool GetStats(VoiceMediaReceiveInfo* info,
bool get_and_clear_legacy_stats) override {
RTC_CHECK_NOTREACHED();
return false;
return GetReceiveStats(info, get_and_clear_legacy_stats);
}
private:
// Functions not implemented on this interface
MediaChannel* ImplForTesting() override {
// This class and its subclasses are not interface classes.
RTC_CHECK_NOTREACHED();

View File

@ -15,6 +15,25 @@ namespace cricket {
// Note: The VideoMediaChannel default implementations are not used here, and
// should be removed from that interface.
// TODO(bugs.webrtc.org/13931): Remove them.
VoiceMediaShimChannel::VoiceMediaShimChannel(
std::unique_ptr<VoiceMediaSendChannelInterface> send_impl,
std::unique_ptr<VoiceMediaReceiveChannelInterface> receive_impl)
: VoiceMediaChannel(MediaChannel::Role::kBoth, nullptr, false),
send_impl_(std::move(send_impl)),
receive_impl_(std::move(receive_impl)) {
if (send_impl_ && receive_impl_) {
send_impl_->SetSsrcListChangedCallback(
[this](const std::set<uint32_t>& choices) {
receive_impl_->ChooseReceiverReportSsrc(choices);
});
send_impl_->SetSendCodecChangedCallback([this]() {
receive_impl_->SetReceiveNackEnabled(send_impl_->SendCodecHasNack());
receive_impl_->SetReceiveNonSenderRttEnabled(
send_impl_->SenderNonSenderRttEnabled());
});
}
}
VideoMediaShimChannel::VideoMediaShimChannel(
std::unique_ptr<VideoMediaSendChannelInterface> send_impl,
std::unique_ptr<VideoMediaReceiveChannelInterface> receive_impl)

View File

@ -47,13 +47,261 @@
#include "rtc_base/network/sent_packet.h"
#include "rtc_base/network_route.h"
namespace cricket {
// The VideoMediaShimChannel is replacing the VideoMediaChannel
// interface.
// If called with both send_impl and receive_impl, it operates in kBoth
// mode; if called with only one, it will shim that one and DCHECK if one
// tries to do functions belonging to the other.
class VoiceMediaShimChannel : public VoiceMediaChannel {
public:
VoiceMediaShimChannel(
std::unique_ptr<VoiceMediaSendChannelInterface> send_impl,
std::unique_ptr<VoiceMediaReceiveChannelInterface> receive_impl);
VoiceMediaSendChannelInterface* AsVoiceSendChannel() override { return this; }
VoiceMediaReceiveChannelInterface* AsVoiceReceiveChannel() override {
return this;
}
VideoMediaSendChannelInterface* AsVideoSendChannel() override {
RTC_CHECK_NOTREACHED();
return nullptr;
}
VideoMediaReceiveChannelInterface* AsVideoReceiveChannel() override {
RTC_CHECK_NOTREACHED();
return nullptr;
}
// SetInterface needs to run on both send and receive channels.
void SetInterface(MediaChannelNetworkInterface* iface) override {
if (send_impl_) {
send_impl()->SetInterface(iface);
}
if (receive_impl_) {
receive_impl()->SetInterface(iface);
}
}
// Not really valid for this mode
MediaChannel* ImplForTesting() override {
RTC_CHECK_NOTREACHED();
return nullptr;
}
// Implementation of MediaBaseChannelInterface
cricket::MediaType media_type() const override { return MEDIA_TYPE_VIDEO; }
// Implementation of MediaSendChannelInterface
void OnPacketSent(const rtc::SentPacket& sent_packet) override {
send_impl()->OnPacketSent(sent_packet);
}
void OnReadyToSend(bool ready) override { send_impl()->OnReadyToSend(ready); }
void OnNetworkRouteChanged(absl::string_view transport_name,
const rtc::NetworkRoute& network_route) override {
send_impl()->OnNetworkRouteChanged(transport_name, network_route);
}
void SetExtmapAllowMixed(bool extmap_allow_mixed) override {
send_impl()->SetExtmapAllowMixed(extmap_allow_mixed);
}
bool HasNetworkInterface() const override {
return send_impl()->HasNetworkInterface();
}
bool ExtmapAllowMixed() const override {
return send_impl()->ExtmapAllowMixed();
}
bool AddSendStream(const StreamParams& sp) override {
return send_impl()->AddSendStream(sp);
}
bool RemoveSendStream(uint32_t ssrc) override {
return send_impl()->RemoveSendStream(ssrc);
}
void SetFrameEncryptor(uint32_t ssrc,
rtc::scoped_refptr<webrtc::FrameEncryptorInterface>
frame_encryptor) override {
send_impl()->SetFrameEncryptor(ssrc, frame_encryptor);
}
webrtc::RTCError SetRtpSendParameters(
uint32_t ssrc,
const webrtc::RtpParameters& parameters,
webrtc::SetParametersCallback callback = nullptr) override {
return send_impl()->SetRtpSendParameters(ssrc, parameters,
std::move(callback));
}
void SetEncoderToPacketizerFrameTransformer(
uint32_t ssrc,
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
override {
return send_impl()->SetEncoderToPacketizerFrameTransformer(
ssrc, frame_transformer);
}
webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override {
return send_impl()->GetRtpSendParameters(ssrc);
}
// Implementation of MediaReceiveChannelInterface
void OnPacketReceived(const webrtc::RtpPacketReceived& packet) override {
receive_impl()->OnPacketReceived(packet);
}
bool AddRecvStream(const StreamParams& sp) override {
return receive_impl()->AddRecvStream(sp);
}
bool RemoveRecvStream(uint32_t ssrc) override {
return receive_impl()->RemoveRecvStream(ssrc);
}
void ResetUnsignaledRecvStream() override {
return receive_impl()->ResetUnsignaledRecvStream();
}
absl::optional<uint32_t> GetUnsignaledSsrc() const override {
return receive_impl()->GetUnsignaledSsrc();
}
void ChooseReceiverReportSsrc(const std::set<uint32_t>& choices) override {
return receive_impl()->ChooseReceiverReportSsrc(choices);
}
void OnDemuxerCriteriaUpdatePending() override {
receive_impl()->OnDemuxerCriteriaUpdatePending();
}
void OnDemuxerCriteriaUpdateComplete() override {
receive_impl()->OnDemuxerCriteriaUpdateComplete();
}
void SetFrameDecryptor(uint32_t ssrc,
rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
frame_decryptor) override {
receive_impl()->SetFrameDecryptor(ssrc, frame_decryptor);
}
void SetDepacketizerToDecoderFrameTransformer(
uint32_t ssrc,
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
override {
receive_impl()->SetDepacketizerToDecoderFrameTransformer(ssrc,
frame_transformer);
}
bool SendCodecHasNack() const override {
return send_impl()->SendCodecHasNack();
}
void SetSendCodecChangedCallback(
absl::AnyInvocable<void()> callback) override {
send_impl()->SetSendCodecChangedCallback(std::move(callback));
}
// Implementation of VoiceMediaSendChannel
bool SetSendParameters(const AudioSendParameters& params) override {
return send_impl()->SetSendParameters(params);
}
void SetSend(bool send) override { return send_impl()->SetSend(send); }
bool SetAudioSend(uint32_t ssrc,
bool enable,
const AudioOptions* options,
AudioSource* source) override {
return send_impl()->SetAudioSend(ssrc, enable, options, source);
}
bool CanInsertDtmf() override { return send_impl()->CanInsertDtmf(); }
bool InsertDtmf(uint32_t ssrc, int event, int duration) override {
return send_impl()->InsertDtmf(ssrc, event, duration);
}
bool GetStats(VoiceMediaSendInfo* info) override {
return send_impl()->GetStats(info);
}
bool SenderNackEnabled() const override {
return send_impl()->SenderNackEnabled();
}
bool SenderNonSenderRttEnabled() const override {
return send_impl()->SenderNonSenderRttEnabled();
}
// Implementation of VoiceMediaReceiveChannelInterface
bool SetRecvParameters(const AudioRecvParameters& params) override {
return receive_impl()->SetRecvParameters(params);
}
webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override {
return receive_impl()->GetRtpReceiveParameters(ssrc);
}
std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override {
return receive_impl()->GetSources(ssrc);
}
webrtc::RtpParameters GetDefaultRtpReceiveParameters() const override {
return receive_impl()->GetDefaultRtpReceiveParameters();
}
void SetPlayout(bool playout) override {
return receive_impl()->SetPlayout(playout);
}
bool SetOutputVolume(uint32_t ssrc, double volume) override {
return receive_impl()->SetOutputVolume(ssrc, volume);
}
bool SetDefaultOutputVolume(double volume) override {
return receive_impl()->SetDefaultOutputVolume(volume);
}
void SetRawAudioSink(
uint32_t ssrc,
std::unique_ptr<webrtc::AudioSinkInterface> sink) override {
return receive_impl()->SetRawAudioSink(ssrc, std::move(sink));
}
void SetDefaultRawAudioSink(
std::unique_ptr<webrtc::AudioSinkInterface> sink) override {
return receive_impl()->SetDefaultRawAudioSink(std::move(sink));
}
bool GetStats(VoiceMediaReceiveInfo* info, bool reset_legacy) override {
return receive_impl_->GetStats(info, reset_legacy);
}
void SetReceiveNackEnabled(bool enabled) override {
receive_impl_->SetReceiveNackEnabled(enabled);
}
void SetReceiveNonSenderRttEnabled(bool enabled) override {
receive_impl_->SetReceiveNonSenderRttEnabled(enabled);
}
void SetSsrcListChangedCallback(
absl::AnyInvocable<void(const std::set<uint32_t>&)> callback) override {
send_impl()->SetSsrcListChangedCallback(std::move(callback));
}
// Implementation of Delayable
bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override {
return receive_impl()->SetBaseMinimumPlayoutDelayMs(ssrc, delay_ms);
}
absl::optional<int> GetBaseMinimumPlayoutDelayMs(
uint32_t ssrc) const override {
return receive_impl()->GetBaseMinimumPlayoutDelayMs(ssrc);
}
bool GetSendStats(VoiceMediaSendInfo* info) override {
return send_impl()->GetStats(info);
}
bool GetReceiveStats(VoiceMediaReceiveInfo* info,
bool reset_legacy) override {
return receive_impl()->GetStats(info, reset_legacy);
}
// Only for testing of implementations - these will be used to static_cast the
// pointers to the implementations, so can only be safely used in conjunction
// with the corresponding create functions.
VoiceMediaSendChannelInterface* SendImplForTesting() {
return send_impl_.get();
}
VoiceMediaReceiveChannelInterface* ReceiveImplForTesting() {
return receive_impl_.get();
}
private:
VoiceMediaSendChannelInterface* send_impl() { return send_impl_.get(); }
VoiceMediaReceiveChannelInterface* receive_impl() {
RTC_DCHECK(receive_impl_);
return receive_impl_.get();
}
const VoiceMediaSendChannelInterface* send_impl() const {
RTC_DCHECK(send_impl_);
return send_impl_.get();
}
const VoiceMediaReceiveChannelInterface* receive_impl() const {
return receive_impl_.get();
}
std::unique_ptr<VoiceMediaSendChannelInterface> send_impl_;
std::unique_ptr<VoiceMediaReceiveChannelInterface> receive_impl_;
};
// The VideoMediaShimChannel is replacing the VideoMediaChannel
// interface.
// If called with both send_impl and receive_impl, it operates in kBoth
// mode; if called with only one, it will shim that one and DCHECK if one
// tries to do functions belonging to the other.
namespace cricket {
class VideoMediaShimChannel : public VideoMediaChannel {
public:
VideoMediaShimChannel(

View File

@ -441,8 +441,21 @@ VoiceMediaChannel* WebRtcVoiceEngine::CreateMediaChannel(
const webrtc::CryptoOptions& crypto_options,
webrtc::AudioCodecPairId codec_pair_id) {
RTC_DCHECK_RUN_ON(call->worker_thread());
return new WebRtcVoiceMediaChannel(role, this, config, options,
crypto_options, call, codec_pair_id);
std::unique_ptr<VoiceMediaSendChannelInterface> send_channel;
std::unique_ptr<VoiceMediaReceiveChannelInterface> receive_channel;
if (role == MediaChannel::Role::kSend || role == MediaChannel::Role::kBoth) {
send_channel = std::make_unique<WebRtcVoiceMediaChannel>(
MediaChannel::Role::kSend, this, config, options, crypto_options, call,
codec_pair_id);
}
if (role == MediaChannel::Role::kReceive ||
role == MediaChannel::Role::kBoth) {
receive_channel = std::make_unique<WebRtcVoiceMediaChannel>(
MediaChannel::Role::kReceive, this, config, options, crypto_options,
call, codec_pair_id);
}
return new VoiceMediaShimChannel(std::move(send_channel),
std::move(receive_channel));
}
void WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {

View File

@ -53,6 +53,7 @@
#include "media/base/codec.h"
#include "media/base/media_channel.h"
#include "media/base/media_channel_impl.h"
#include "media/base/media_channel_shim.h"
#include "media/base/media_config.h"
#include "media/base/media_engine.h"
#include "media/base/rtp_utils.h"

View File

@ -26,6 +26,7 @@
#include "media/base/fake_media_engine.h"
#include "media/base/fake_network_interface.h"
#include "media/base/fake_rtp.h"
#include "media/base/media_channel_shim.h"
#include "media/base/media_constants.h"
#include "media/engine/fake_webrtc_call.h"
#include "modules/audio_device/include/mock_audio_device.h"
@ -803,6 +804,22 @@ class WebRtcVoiceEngineTestFake : public ::testing::TestWithParam<bool> {
return apm_config_.high_pass_filter.enabled;
}
cricket::WebRtcVoiceMediaChannel* SendImplFromPointer(
cricket::VoiceMediaChannel* channel) {
return static_cast<cricket::WebRtcVoiceMediaChannel*>(
static_cast<cricket::VoiceMediaShimChannel*>(channel)
->SendImplForTesting());
}
cricket::WebRtcVoiceMediaChannel* SendImpl() {
return SendImplFromPointer(channel_);
}
cricket::WebRtcVoiceMediaChannel* ReceiveImpl() {
return static_cast<cricket::WebRtcVoiceMediaChannel*>(
static_cast<cricket::VoiceMediaShimChannel*>(channel_)
->ReceiveImplForTesting());
}
protected:
rtc::AutoThread main_thread_;
const bool use_null_apm_;
@ -839,8 +856,7 @@ TEST_P(WebRtcVoiceEngineTestFake, CreateSendStream) {
EXPECT_EQ(kSsrcX, config.rtp.ssrc);
EXPECT_EQ("", config.rtp.c_name);
EXPECT_EQ(0u, config.rtp.extensions.size());
EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
config.send_transport);
EXPECT_EQ(SendImpl(), config.send_transport);
}
// Test that we can add a receive stream and that it has the correct defaults.
@ -851,8 +867,7 @@ TEST_P(WebRtcVoiceEngineTestFake, CreateRecvStream) {
GetRecvStreamConfig(kSsrcX);
EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc);
EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
config.rtcp_send_transport);
EXPECT_EQ(ReceiveImpl(), config.rtcp_send_transport);
EXPECT_EQ("", config.sync_group);
}
@ -3073,18 +3088,16 @@ TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
EXPECT_CALL(*adm_, Recording()).Times(2).WillRepeatedly(Return(false));
EXPECT_CALL(*adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_,
cricket::MediaConfig(), cricket::AudioOptions(),
webrtc::CryptoOptions(), webrtc::AudioCodecPairId::Create())));
std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_,
cricket::MediaConfig(), cricket::AudioOptions(),
webrtc::CryptoOptions(), webrtc::AudioCodecPairId::Create())));
std::unique_ptr<cricket::VoiceMediaChannel> channel1(
engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_, cricket::MediaConfig(),
cricket::AudioOptions(), webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create()));
std::unique_ptr<cricket::VoiceMediaChannel> channel2(
engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_, cricket::MediaConfig(),
cricket::AudioOptions(), webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create()));
// Have to add a stream to make SetSend work.
cricket::StreamParams stream1;
@ -3105,11 +3118,13 @@ TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
VerifyGainControlEnabledCorrectly();
EXPECT_TRUE(apm_config_.noise_suppression.enabled);
EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
EXPECT_EQ(parameters_options_all.options, channel1->options());
EXPECT_EQ(parameters_options_all.options,
SendImplFromPointer(channel1.get())->options());
EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
VerifyEchoCancellationSettings(/*enabled=*/true);
VerifyGainControlEnabledCorrectly();
EXPECT_EQ(parameters_options_all.options, channel2->options());
EXPECT_EQ(parameters_options_all.options,
SendImplFromPointer(channel2.get())->options());
}
// unset NS
@ -3125,7 +3140,7 @@ TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
expected_options.echo_cancellation = true;
expected_options.auto_gain_control = true;
expected_options.noise_suppression = false;
EXPECT_EQ(expected_options, channel1->options());
EXPECT_EQ(expected_options, SendImplFromPointer(channel1.get())->options());
}
// unset AGC
@ -3140,7 +3155,7 @@ TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
expected_options.echo_cancellation = true;
expected_options.auto_gain_control = false;
expected_options.noise_suppression = true;
EXPECT_EQ(expected_options, channel2->options());
EXPECT_EQ(expected_options, SendImplFromPointer(channel2.get())->options());
}
EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
@ -3181,7 +3196,7 @@ TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
expected_options.echo_cancellation = true;
expected_options.auto_gain_control = false;
expected_options.noise_suppression = false;
EXPECT_EQ(expected_options, channel2->options());
EXPECT_EQ(expected_options, SendImplFromPointer(channel2.get())->options());
}
}
@ -3190,25 +3205,23 @@ TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
EXPECT_TRUE(SetupSendStream());
cricket::FakeNetworkInterface network_interface;
cricket::MediaConfig config;
std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel;
std::unique_ptr<cricket::VoiceMediaChannel> channel;
webrtc::RtpParameters parameters;
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(cricket::MediaChannel::Role::kBoth, &call_,
config, cricket::AudioOptions(),
webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create())));
channel.reset(engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_, config,
cricket::AudioOptions(), webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create()));
channel->SetInterface(&network_interface);
// Default value when DSCP is disabled should be DSCP_DEFAULT.
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
channel->SetInterface(nullptr);
config.enable_dscp = true;
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(cricket::MediaChannel::Role::kBoth, &call_,
config, cricket::AudioOptions(),
webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create())));
channel.reset(engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_, config,
cricket::AudioOptions(), webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create()));
channel->SetInterface(&network_interface);
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
@ -3228,18 +3241,18 @@ TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
// Packets should also self-identify their dscp in PacketOptions.
const uint8_t kData[10] = {0};
EXPECT_TRUE(channel->SendRtcp(kData, sizeof(kData)));
EXPECT_TRUE(
SendImplFromPointer(channel.get())->SendRtcp(kData, sizeof(kData)));
EXPECT_EQ(rtc::DSCP_CS1, network_interface.options().dscp);
channel->SetInterface(nullptr);
// Verify that setting the option to false resets the
// DiffServCodePoint.
config.enable_dscp = false;
channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
engine_->CreateMediaChannel(cricket::MediaChannel::Role::kBoth, &call_,
config, cricket::AudioOptions(),
webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create())));
channel.reset(engine_->CreateMediaChannel(
cricket::MediaChannel::Role::kBoth, &call_, config,
cricket::AudioOptions(), webrtc::CryptoOptions(),
webrtc::AudioCodecPairId::Create()));
channel->SetInterface(&network_interface);
// Default value when DSCP is disabled should be DSCP_DEFAULT.
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
@ -3444,8 +3457,7 @@ TEST_P(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
EXPECT_TRUE(SetupSendStream());
cricket::WebRtcVoiceMediaChannel* media_channel =
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
cricket::VoiceMediaChannel* media_channel = ReceiveImpl();
SetSendParameters(send_parameters_);
EXPECT_TRUE(media_channel->AddRecvStream(
cricket::StreamParams::CreateLegacy(kAudioSsrc)));
@ -3617,8 +3629,7 @@ TEST_P(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
TEST_P(WebRtcVoiceEngineTestFake, GetSourcesWithNonExistingSsrc) {
// Setup an recv stream with `kSsrcX`.
SetupRecvStream();
cricket::WebRtcVoiceMediaChannel* media_channel =
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
cricket::WebRtcVoiceMediaChannel* media_channel = ReceiveImpl();
// Call GetSources with `kSsrcY` which doesn't exist.
std::vector<webrtc::RtpSource> sources = media_channel->GetSources(kSsrcY);
EXPECT_EQ(0u, sources.size());