diff --git a/webrtc/media/engine/fakewebrtcvoiceengine.h b/webrtc/media/engine/fakewebrtcvoiceengine.h index 5f0be5c977..8d15f5249e 100644 --- a/webrtc/media/engine/fakewebrtcvoiceengine.h +++ b/webrtc/media/engine/fakewebrtcvoiceengine.h @@ -121,7 +121,7 @@ class FakeAudioProcessing : public webrtc::AudioProcessing { class FakeWebRtcVoiceEngine : public webrtc::VoEAudioProcessing, public webrtc::VoEBase, public webrtc::VoECodec, - public webrtc::VoEHardware, public webrtc::VoERTP_RTCP, + public webrtc::VoEHardware, public webrtc::VoEVolumeControl { public: struct Channel { @@ -136,7 +136,6 @@ class FakeWebRtcVoiceEngine bool opus_dtx = false; int cn8_type = 13; int cn16_type = 105; - uint32_t send_ssrc = 0; int associate_send_channel = -1; std::vector recv_codecs; webrtc::CodecInst send_codec; @@ -156,9 +155,6 @@ class FakeWebRtcVoiceEngine bool IsInited() const { return inited_; } int GetLastChannel() const { return last_channel_; } int GetNumChannels() const { return static_cast(channels_.size()); } - uint32_t GetLocalSSRC(int channel) { - return channels_[channel]->send_ssrc; - } bool GetPlayout(int channel) { return channels_[channel]->playout; } @@ -434,43 +430,6 @@ class FakeWebRtcVoiceEngine WEBRTC_STUB(EnableBuiltInNS, (bool enable)); bool BuiltInNSIsAvailable() const override { return false; } - // webrtc::VoERTP_RTCP - WEBRTC_FUNC(SetLocalSSRC, (int channel, unsigned int ssrc)) { - WEBRTC_CHECK_CHANNEL(channel); - channels_[channel]->send_ssrc = ssrc; - return 0; - } - WEBRTC_STUB(GetLocalSSRC, (int channel, unsigned int& ssrc)); - WEBRTC_STUB(GetRemoteSSRC, (int channel, unsigned int& ssrc)); - WEBRTC_STUB(SetSendAudioLevelIndicationStatus, (int channel, bool enable, - unsigned char id)); - WEBRTC_STUB(SetReceiveAudioLevelIndicationStatus, (int channel, bool enable, - unsigned char id)); - WEBRTC_STUB(SetSendAbsoluteSenderTimeStatus, (int channel, bool enable, - unsigned char id)); - WEBRTC_STUB(SetReceiveAbsoluteSenderTimeStatus, (int channel, bool enable, - unsigned char id)); - WEBRTC_STUB(SetRTCPStatus, (int channel, bool enable)); - WEBRTC_STUB(GetRTCPStatus, (int channel, bool& enabled)); - WEBRTC_STUB(SetRTCP_CNAME, (int channel, const char cname[256])); - WEBRTC_STUB(GetRTCP_CNAME, (int channel, char cname[256])); - WEBRTC_STUB(GetRemoteRTCP_CNAME, (int channel, char* cname)); - WEBRTC_STUB(GetRemoteRTCPData, (int channel, unsigned int& NTPHigh, - unsigned int& NTPLow, - unsigned int& timestamp, - unsigned int& playoutTimestamp, - unsigned int* jitter, - unsigned short* fractionLost)); - WEBRTC_STUB(GetRemoteRTCPReportBlocks, - (int channel, std::vector* receive_blocks)); - WEBRTC_STUB(GetRTPStatistics, (int channel, unsigned int& averageJitterMs, - unsigned int& maxJitterMs, - unsigned int& discardedPackets)); - WEBRTC_STUB(GetRTCPStatistics, (int channel, webrtc::CallStatistics& stats)); - WEBRTC_STUB(SetREDStatus, (int channel, bool enable, int redPayloadtype)); - WEBRTC_STUB(GetREDStatus, (int channel, bool& enable, int& redPayloadtype)); - WEBRTC_STUB(SetNACKStatus, (int channel, bool enable, int maxNoPackets)); - // webrtc::VoEVolumeControl WEBRTC_STUB(SetSpeakerVolume, (unsigned int)); WEBRTC_STUB(GetSpeakerVolume, (unsigned int&)); diff --git a/webrtc/media/engine/webrtcvoe.h b/webrtc/media/engine/webrtcvoe.h index cbb68632c9..41a5b5fe6a 100644 --- a/webrtc/media/engine/webrtcvoe.h +++ b/webrtc/media/engine/webrtcvoe.h @@ -23,7 +23,6 @@ #include "webrtc/voice_engine/include/voe_codec.h" #include "webrtc/voice_engine/include/voe_errors.h" #include "webrtc/voice_engine/include/voe_hardware.h" -#include "webrtc/voice_engine/include/voe_rtp_rtcp.h" #include "webrtc/voice_engine/include/voe_volume_control.h" namespace cricket { @@ -75,21 +74,19 @@ class VoEWrapper { public: VoEWrapper() : engine_(webrtc::VoiceEngine::Create()), processing_(engine_), - base_(engine_), codec_(engine_), hw_(engine_), rtp_(engine_), + base_(engine_), codec_(engine_), hw_(engine_), volume_(engine_) { } VoEWrapper(webrtc::VoEAudioProcessing* processing, webrtc::VoEBase* base, webrtc::VoECodec* codec, webrtc::VoEHardware* hw, - webrtc::VoERTP_RTCP* rtp, webrtc::VoEVolumeControl* volume) : engine_(NULL), processing_(processing), base_(base), codec_(codec), hw_(hw), - rtp_(rtp), volume_(volume) { } ~VoEWrapper() {} @@ -98,7 +95,6 @@ class VoEWrapper { webrtc::VoEBase* base() const { return base_.get(); } webrtc::VoECodec* codec() const { return codec_.get(); } webrtc::VoEHardware* hw() const { return hw_.get(); } - webrtc::VoERTP_RTCP* rtp() const { return rtp_.get(); } webrtc::VoEVolumeControl* volume() const { return volume_.get(); } int error() { return base_->LastError(); } @@ -108,7 +104,6 @@ class VoEWrapper { scoped_voe_ptr base_; scoped_voe_ptr codec_; scoped_voe_ptr hw_; - scoped_voe_ptr rtp_; scoped_voe_ptr volume_; }; } // namespace cricket diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index c1084c303b..eb9b4bb356 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -1285,12 +1285,14 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { RTC_DCHECK_GE(ch, 0); RTC_DCHECK(call); config_.rtp.remote_ssrc = remote_ssrc; - config_.rtp.local_ssrc = local_ssrc; config_.rtcp_send_transport = rtcp_send_transport; config_.voe_channel_id = ch; config_.sync_group = sync_group; config_.decoder_factory = decoder_factory; - RecreateAudioReceiveStream(use_transport_cc, use_nack, extensions); + RecreateAudioReceiveStream(local_ssrc, + use_transport_cc, + use_nack, + extensions); } ~WebRtcAudioReceiveStream() { @@ -1298,21 +1300,31 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { call_->DestroyAudioReceiveStream(stream_); } - void RecreateAudioReceiveStream( - const std::vector& extensions) { + void RecreateAudioReceiveStream(uint32_t local_ssrc) { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); - RecreateAudioReceiveStream(config_.rtp.transport_cc, + RecreateAudioReceiveStream(local_ssrc, + config_.rtp.transport_cc, config_.rtp.nack.rtp_history_ms != 0, - extensions); + config_.rtp.extensions); } void RecreateAudioReceiveStream(bool use_transport_cc, bool use_nack) { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); - RecreateAudioReceiveStream(use_transport_cc, + RecreateAudioReceiveStream(config_.rtp.local_ssrc, + use_transport_cc, use_nack, config_.rtp.extensions); } + void RecreateAudioReceiveStream( + const std::vector& extensions) { + RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); + RecreateAudioReceiveStream(config_.rtp.local_ssrc, + config_.rtp.transport_cc, + config_.rtp.nack.rtp_history_ms != 0, + extensions); + } + webrtc::AudioReceiveStream::Stats GetStats() const { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); RTC_DCHECK(stream_); @@ -1331,6 +1343,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { private: void RecreateAudioReceiveStream( + uint32_t local_ssrc, bool use_transport_cc, bool use_nack, const std::vector& extensions) { @@ -1339,6 +1352,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { call_->DestroyAudioReceiveStream(stream_); stream_ = nullptr; } + config_.rtp.local_ssrc = local_ssrc; config_.rtp.transport_cc = use_transport_cc; config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; config_.rtp.extensions = extensions; @@ -2022,17 +2036,16 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { return false; } - // At this point the channel's local SSRC has been updated. If the channel is - // the first send channel make sure that all the receive channels are updated - // with the same SSRC in order to send receiver reports. + // At this point the stream's local SSRC has been updated. If it is the first + // send stream, make sure that all the receive streams are updated with the + // same SSRC in order to send receiver reports. if (send_streams_.size() == 1) { receiver_reports_ssrc_ = ssrc; - for (const auto& stream : recv_streams_) { - int recv_channel = stream.second->channel(); - if (engine()->voe()->rtp()->SetLocalSSRC(recv_channel, ssrc) != 0) { - LOG_RTCERR2(SetLocalSSRC, recv_channel, ssrc); - return false; - } + for (const auto& kv : recv_streams_) { + // TODO(solenberg): Allow applications to set the RTCP SSRC of receive + // streams instead, so we can avoid recreating the streams here. + kv.second->RecreateAudioReceiveStream(ssrc); + int recv_channel = kv.second->channel(); engine()->voe()->base()->AssociateSendChannel(recv_channel, channel); LOG(LS_INFO) << "VoiceEngine channel #" << recv_channel << " is associated with channel #" << channel << "."; diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc index 7c25367164..167ec89267 100644 --- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc +++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc @@ -59,7 +59,6 @@ class FakeVoEWrapper : public cricket::VoEWrapper { engine, // base engine, // codec engine, // hw - engine, // rtp engine) { // volume } }; @@ -2508,13 +2507,11 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) { // receive channel is created before the send channel. TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) { EXPECT_TRUE(SetupChannel()); - EXPECT_TRUE(AddRecvStream(1)); - int receive_channel_num = voe_.GetLastChannel(); + EXPECT_TRUE(AddRecvStream(kSsrc2)); EXPECT_TRUE(channel_->AddSendStream( - cricket::StreamParams::CreateLegacy(1234))); - - EXPECT_TRUE(call_.GetAudioSendStream(1234)); - EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num)); + cricket::StreamParams::CreateLegacy(kSsrc1))); + EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1)); + EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc); } // Test that we can properly receive packets.