- Remove use of VoERTP_RTCP::SetLocalSSRC() for receive streams; recreate them instead.
- Remove VoERTP_RTCP from VoEWrapper and FakeWebRtcVoiceEngine.

BUG=webrtc:4690

Review-Url: https://codereview.webrtc.org/2072783002
Cr-Commit-Position: refs/heads/master@{#13174}
diff --git a/webrtc/media/engine/fakewebrtcvoiceengine.h b/webrtc/media/engine/fakewebrtcvoiceengine.h
index 5f0be5c9..8d15f52 100644
--- a/webrtc/media/engine/fakewebrtcvoiceengine.h
+++ b/webrtc/media/engine/fakewebrtcvoiceengine.h
@@ -121,7 +121,7 @@
 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 @@
     bool opus_dtx = false;
     int cn8_type = 13;
     int cn16_type = 105;
-    uint32_t send_ssrc = 0;
     int associate_send_channel = -1;
     std::vector<webrtc::CodecInst> recv_codecs;
     webrtc::CodecInst send_codec;
@@ -156,9 +155,6 @@
   bool IsInited() const { return inited_; }
   int GetLastChannel() const { return last_channel_; }
   int GetNumChannels() const { return static_cast<int>(channels_.size()); }
-  uint32_t GetLocalSSRC(int channel) {
-    return channels_[channel]->send_ssrc;
-  }
   bool GetPlayout(int channel) {
     return channels_[channel]->playout;
   }
@@ -434,43 +430,6 @@
   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<webrtc::ReportBlock>* 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 cbb6863..41a5b5f 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 @@
  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 @@
   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 @@
   scoped_voe_ptr<webrtc::VoEBase> base_;
   scoped_voe_ptr<webrtc::VoECodec> codec_;
   scoped_voe_ptr<webrtc::VoEHardware> hw_;
-  scoped_voe_ptr<webrtc::VoERTP_RTCP> rtp_;
   scoped_voe_ptr<webrtc::VoEVolumeControl> volume_;
 };
 }  // namespace cricket
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index c1084c3..eb9b4bb 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -1285,12 +1285,14 @@
     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 @@
     call_->DestroyAudioReceiveStream(stream_);
   }
 
-  void RecreateAudioReceiveStream(
-      const std::vector<webrtc::RtpExtension>& 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<webrtc::RtpExtension>& 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 @@
 
  private:
   void RecreateAudioReceiveStream(
+      uint32_t local_ssrc,
       bool use_transport_cc,
       bool use_nack,
       const std::vector<webrtc::RtpExtension>& extensions) {
@@ -1339,6 +1352,7 @@
       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 @@
     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 7c25367..167ec89 100644
--- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc
+++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
@@ -59,7 +59,6 @@
                             engine,  // base
                             engine,  // codec
                             engine,  // hw
-                            engine,  // rtp
                             engine) {  // volume
   }
 };
@@ -2508,13 +2507,11 @@
 // 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.