Refactor the internal API to the rtp/rtcp module.
Combination of previous CLs in revisions 2211, 2212, 2214, 2215, 2216.
Review URL: https://webrtc-codereview.appspot.com/570008

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2231 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/rtp_rtcp/source/Bitrate.h b/src/modules/rtp_rtcp/source/Bitrate.h
index ab5637b..3859aaa 100644
--- a/src/modules/rtp_rtcp/source/Bitrate.h
+++ b/src/modules/rtp_rtcp/source/Bitrate.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -25,9 +25,6 @@
 public:
     Bitrate(RtpRtcpClock* clock);
 
-    // initialize members
-    void Init();
-
     // calculate rates
     void Process();
 
diff --git a/src/modules/rtp_rtcp/source/bitrate.cc b/src/modules/rtp_rtcp/source/bitrate.cc
index be0c7dd..0fbb7ad 100644
--- a/src/modules/rtp_rtcp/source/bitrate.cc
+++ b/src/modules/rtp_rtcp/source/bitrate.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -29,21 +29,6 @@
 }
 
 void
-Bitrate::Init()
-{
-    _packetRate = 0;
-    _bitrate = 0;
-    _timeLastRateUpdate = 0;
-    _bytesCount = 0;
-    _packetCount = 0;
-    _bitrateNextIdx = 0;
-
-    memset(_packetRateArray, 0, sizeof(_packetRateArray));
-    memset(_bitrateDiffMS, 0, sizeof(_bitrateDiffMS));
-    memset(_bitrateArray, 0, sizeof(_bitrateArray));
-}
-
-void
 Bitrate::Update(const WebRtc_Word32 bytes)
 {
     _bytesCount += bytes;
diff --git a/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
index 9fdd6ca..d937f35 100644
--- a/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
@@ -70,7 +70,11 @@
 
 void RtcpFormatRembTest::SetUp() {
   system_clock_ = ModuleRTPUtility::GetSystemClock();
-  dummy_rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+  RtpRtcp::Configuration configuration;
+  configuration.id = 0;
+  configuration.audio = false;
+  configuration.clock = system_clock_;
+  dummy_rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
   rtcp_sender_ = new RTCPSender(0, false, system_clock_, dummy_rtp_rtcp_impl_);
   rtcp_receiver_ = new RTCPReceiver(0, system_clock_, dummy_rtp_rtcp_impl_);
   test_transport_ = new TestTransport(rtcp_receiver_);
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.cc b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
index 2fc7c83..d9365e9 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -165,9 +165,6 @@
       GetReportBlockInformation(remoteSSRC);
 
   if (reportBlock == NULL) {
-    WEBRTC_TRACE(kTraceError, kTraceRtpRtcp, _id,
-                 "\tfailed to GetReportBlockInformation(%u)",
-                 remoteSSRC);
     return -1;
   }
   if (RTT) {
@@ -202,16 +199,6 @@
   return 0;
 }
 
-void
-RTCPReceiver::UpdateLipSync(const WebRtc_Word32 audioVideoOffset) const
-{
-    CriticalSectionScoped lock(_criticalSectionFeedbacks);
-    if(_cbRtcpFeedback)
-    {
-        _cbRtcpFeedback->OnLipSyncUpdate(_id,audioVideoOffset);
-    }
-};
-
 WebRtc_Word32
 RTCPReceiver::NTP(WebRtc_UWord32 *ReceivedNTPsecs,
                   WebRtc_UWord32 *ReceivedNTPfrac,
@@ -1247,9 +1234,6 @@
     // Might trigger a OnReceivedBandwidthEstimateUpdate.
     UpdateTMMBR();
   }
-  if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) {
-    _rtpRtcp.OnReceivedNTP();
-  }
   if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq) {
     _rtpRtcp.OnRequestSendReport();
   }
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.h b/src/modules/rtp_rtcp/source/rtcp_receiver.h
index 294e67d..df2d18b4 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -76,8 +76,6 @@
 
     WebRtc_Word32 ResetRTT(const WebRtc_UWord32 remoteSSRC);
 
-    void UpdateLipSync(const WebRtc_Word32 audioVideoOffset) const;
-
     WebRtc_Word32 SenderInfoReceived(RTCPSenderInfo* senderInfo) const;
 
     // get statistics
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index 5bfdb73..9598a43 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -151,10 +151,12 @@
 class TestTransport : public Transport,
                       public RtpData {
  public:
-  explicit TestTransport(RTCPReceiver* rtcp_receiver) :
-    rtcp_receiver_(rtcp_receiver) {
+  explicit TestTransport()
+      : rtcp_receiver_(NULL) {
   }
-
+  void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) {
+    rtcp_receiver_ = rtcp_receiver;
+  }
   virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) {
     ADD_FAILURE();  // FAIL() gives a compile error.
     return -1;
@@ -180,10 +182,15 @@
   RtcpReceiverTest() {
     // system_clock_ = ModuleRTPUtility::GetSystemClock();
     system_clock_ = new FakeSystemClock();
-    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+    test_transport_ = new TestTransport();
+    RtpRtcp::Configuration configuration;
+    configuration.id = 0;
+    configuration.audio = false;
+    configuration.clock = system_clock_;
+    configuration.outgoing_transport = test_transport_;
+    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
     rtcp_receiver_ = new RTCPReceiver(0, system_clock_, rtp_rtcp_impl_);
-    test_transport_ = new TestTransport(rtcp_receiver_);
-    EXPECT_EQ(0, rtp_rtcp_impl_->RegisterIncomingDataCallback(test_transport_));
+    test_transport_->SetRTCPReceiver(rtcp_receiver_);
   }
   ~RtcpReceiverTest() {
     delete rtcp_receiver_;
diff --git a/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
index 2d86682..17fbafc 100644
--- a/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
@@ -59,10 +59,12 @@
 class TestTransport : public Transport,
                       public RtpData {
  public:
-  TestTransport(RTCPReceiver* rtcp_receiver) :
-    rtcp_receiver_(rtcp_receiver) {
+  TestTransport()
+      : rtcp_receiver_(NULL) {
   }
-
+  void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) {
+    rtcp_receiver_ = rtcp_receiver;
+  }
   virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) {
     return -1;
   }
@@ -83,8 +85,9 @@
 
   virtual int OnReceivedPayloadData(const WebRtc_UWord8* payloadData,
                                     const WebRtc_UWord16 payloadSize,
-                                    const WebRtcRTPHeader* rtpHeader)
-                                    {return 0;}
+                                    const WebRtcRTPHeader* rtpHeader) {
+    return 0;
+  }
   RTCPReceiver* rtcp_receiver_;
   RTCPHelp::RTCPPacketInformation rtcp_packet_info_;
 };
@@ -93,14 +96,22 @@
  protected:
   RtcpSenderTest() {
     system_clock_ = ModuleRTPUtility::GetSystemClock();
-    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+    test_transport_ = new TestTransport();
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = 0;
+    configuration.audio = false;
+    configuration.clock = system_clock_;
+    configuration.incoming_data = test_transport_;
+    configuration.outgoing_transport = test_transport_;
+
+    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
     rtcp_sender_ = new RTCPSender(0, false, system_clock_, rtp_rtcp_impl_);
     rtcp_receiver_ = new RTCPReceiver(0, system_clock_, rtp_rtcp_impl_);
-    test_transport_ = new TestTransport(rtcp_receiver_);
+    test_transport_->SetRTCPReceiver(rtcp_receiver_);
     // Initialize
     EXPECT_EQ(0, rtcp_sender_->Init());
     EXPECT_EQ(0, rtcp_sender_->RegisterSendTransport(test_transport_));
-    EXPECT_EQ(0, rtp_rtcp_impl_->RegisterIncomingDataCallback(test_transport_));
   }
   ~RtcpSenderTest() {
     delete rtcp_sender_;
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver.cc b/src/modules/rtp_rtcp/source/rtp_receiver.cc
index ef5e721..40eb6b0 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver.cc
@@ -123,75 +123,6 @@
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 }
 
-void RTPReceiver::Init() {
-  CriticalSectionScoped lock(_criticalSectionRTPReceiver);
-
-  _lastReceiveTime = 0;
-  _lastReceivedPayloadLength = 0;
-  _packetTimeOutMS = 0;
-  _lastReceivedPayloadType = -1;
-  _lastReceivedMediaPayloadType = -1;
-  _redPayloadType = -1;
-
-  memset(&_lastReceivedAudioSpecific, 0, sizeof(_lastReceivedAudioSpecific));
-  _lastReceivedAudioSpecific.channels = 1;
-
-  _lastReceivedVideoSpecific.videoCodecType = kRtpNoVideo;
-  _lastReceivedVideoSpecific.maxRate = 0;
-  _SSRC = 0;
-  _numCSRCs = 0;
-  _numEnergy = 0;
-  _jitterQ4 = 0;
-  _jitterMaxQ4 = 0;
-  _cumulativeLoss = 0;
-  _jitterQ4TransmissionTimeOffset = 0;
-  _useSSRCFilter = false;
-  _SSRCFilter = 0;
-
-  _localTimeLastReceivedTimestamp = 0;
-  _lastReceivedTimestamp = 0;
-  _lastReceivedSequenceNumber = 0;
-  _lastReceivedTransmissionTimeOffset = 0;
-
-  _receivedSeqFirst = 0;
-  _receivedSeqMax = 0;
-  _receivedSeqWraps = 0;
-
-  _receivedPacketOH = 12; // RTP header
-  _receivedByteCount = 0;
-  _receivedOldPacketCount = 0;
-  _receivedInorderPacketCount = 0;
-
-  _lastReportInorderPackets = 0;
-  _lastReportOldPackets = 0;
-  _lastReportSeqMax = 0;
-  _lastReportFractionLost = 0;
-  _lastReportCumulativeLost = 0;
-  _lastReportExtendedHighSeqNum = 0;
-  _lastReportJitter = 0;
-  _lastReportJitterTransmissionTimeOffset = 0;
-
-  _rtpHeaderExtensionMap.Erase();
-
-  while (!_payloadTypeMap.empty()) {
-    std::map<WebRtc_Word8, Payload*>::iterator it = _payloadTypeMap.begin();
-    delete it->second;
-    _payloadTypeMap.erase(it);
-  }
-
-  Bitrate::Init();
-  RTPReceiverAudio::Init();
-  RTPReceiverVideo::Init();
-}
-
-void
-RTPReceiver::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-    RTPReceiverAudio::ChangeUniqueId(id);
-    RTPReceiverVideo::ChangeUniqueId(id);
-}
-
 RtpVideoCodecTypes
 RTPReceiver::VideoCodecType() const
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver.h b/src/modules/rtp_rtcp/source/rtp_receiver.h
index f283676..d6ecfaa 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver.h
@@ -39,10 +39,6 @@
 
     virtual ~RTPReceiver();
 
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-    void Init();
-
     RtpVideoCodecTypes VideoCodecType() const;
     WebRtc_UWord32 MaxConfiguredBitrate() const;
 
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
index 1b870e2..a57da75 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
@@ -40,30 +40,6 @@
     delete _criticalSectionFeedback;
 }
 
-WebRtc_Word32 RTPReceiverAudio::Init() {
-  _lastReceivedFrequency = 8000;
-  _telephoneEvent = false;
-  _telephoneEventForwardToDecoder = false;
-  _telephoneEventDetectEndOfTone = false;
-  _telephoneEventPayloadType = -1;
-
-  _telephoneEventReported.clear();
-
-  _cngNBPayloadType = -1;
-  _cngWBPayloadType = -1;
-  _cngSWBPayloadType = -1;
-  _cngPayloadType = -1;
-  _G722PayloadType = -1;
-  _lastReceivedG722 = false;
-  return 0;
-}
-
-void
-RTPReceiverAudio::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
 WebRtc_Word32
 RTPReceiverAudio::RegisterIncomingAudioCallback(RtpAudioFeedback* incomingMessagesCallback)
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_audio.h b/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
index 89cd062..0b0ba30 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
@@ -27,10 +27,6 @@
     RTPReceiverAudio(const WebRtc_Word32 id);
     virtual ~RTPReceiverAudio();
 
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-    WebRtc_Word32 Init();
-
     WebRtc_Word32 RegisterIncomingAudioCallback(RtpAudioFeedback* incomingMessagesCallback);
 
     ModuleRTPUtility::Payload* RegisterReceiveAudioPayload(
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_video.cc b/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
index c5f99bd..94d49e0 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
@@ -58,16 +58,6 @@
     delete _receiveFEC;
 }
 
-void RTPReceiverVideo::Init() {
-  _currentFecFrameDecoded = false;
-  _packetOverHead = 28;
-  ResetOverUseDetector();
-}
-
-void RTPReceiverVideo::ChangeUniqueId(const WebRtc_Word32 id) {
-  _id = id;
-}
-
 ModuleRTPUtility::Payload* RTPReceiverVideo::RegisterReceiveVideoPayload(
     const char payloadName[RTP_PAYLOAD_NAME_SIZE],
     const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_video.h b/src/modules/rtp_rtcp/source/rtp_receiver_video.h
index f2e223e..ce32293 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_video.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_video.h
@@ -32,10 +32,6 @@
 
   virtual ~RTPReceiverVideo();
 
-  virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-  void Init();
-
   ModuleRTPUtility::Payload* RegisterReceiveVideoPayload(
       const char payloadName[RTP_PAYLOAD_NAME_SIZE],
       const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 8906e20..e2ab811 100644
--- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -36,222 +36,103 @@
 
 const WebRtc_UWord16 kDefaultRtt = 200;
 
-RtpRtcp* RtpRtcp::CreateRtpRtcp(const WebRtc_Word32 id,
-                                bool audio) {
-  if(audio) {
-    WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, id, "CreateRtpRtcp(audio)");
+RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) {
+  if (configuration.clock) {
+    return new ModuleRtpRtcpImpl(configuration);
   } else {
-    WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, id, "CreateRtpRtcp(video)");
-  }
-  // ModuleRTPUtility::GetSystemClock() creates a new instance of a system
-  // clock implementation. The OwnsClock() function informs the module that
-  // it is responsible for deleting the instance.
-  ModuleRtpRtcpImpl* rtp_rtcp_instance = new ModuleRtpRtcpImpl(id,
-      audio, ModuleRTPUtility::GetSystemClock());
-  rtp_rtcp_instance->OwnsClock();
-  return rtp_rtcp_instance;
-}
-
-RtpRtcp* RtpRtcp::CreateRtpRtcp(const WebRtc_Word32 id,
-                                const bool audio,
-                                RtpRtcpClock* clock) {
-  if (audio) {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 id,
-                 "CreateRtpRtcp(audio)");
-  } else {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 id,
-                 "CreateRtpRtcp(video)");
-  }
-  return new ModuleRtpRtcpImpl(id, audio, clock);
-}
-
-void RtpRtcp::DestroyRtpRtcp(RtpRtcp* module) {
-  if (module) {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 static_cast<ModuleRtpRtcpImpl*>(module)->Id(),
-                 "DestroyRtpRtcp()");
-    delete static_cast<ModuleRtpRtcpImpl*>(module);
+    RtpRtcp::Configuration configuration_copy;
+    memcpy(&configuration_copy, &configuration,
+           sizeof(RtpRtcp::Configuration));
+    configuration_copy.clock = ModuleRTPUtility::GetSystemClock();
+    ModuleRtpRtcpImpl* rtp_rtcp_instance =
+        new ModuleRtpRtcpImpl(configuration_copy);
+    rtp_rtcp_instance->OwnsClock();
+    return rtp_rtcp_instance;
   }
 }
 
-ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const WebRtc_Word32 id,
-                                     const bool audio,
-                                     RtpRtcpClock* clock):
-  _rtpSender(id, audio, clock),
-  _rtpReceiver(id, audio, clock, this),
-  _rtcpSender(id, audio, clock, this),
-  _rtcpReceiver(id, clock, this),
-  _owns_clock(false),
-  _clock(*clock),
-  _id(id),
-  _audio(audio),
-  _collisionDetected(false),
-  _lastProcessTime(clock->GetTimeInMS()),
-  _lastBitrateProcessTime(clock->GetTimeInMS()),
-  _lastPacketTimeoutProcessTime(clock->GetTimeInMS()),
-  _packetOverHead(28), // IPV4 UDP
-  _criticalSectionModulePtrs(CriticalSectionWrapper::CreateCriticalSection()),
-  _criticalSectionModulePtrsFeedback(
-    CriticalSectionWrapper::CreateCriticalSection()),
-  _defaultModule(NULL),
-  _audioModule(NULL),
-  _videoModule(NULL),
-  _deadOrAliveActive(false),
-  _deadOrAliveTimeoutMS(0),
-  _deadOrAliveLastTimer(0),
-  _receivedNTPsecsAudio(0),
-  _receivedNTPfracAudio(0),
-  _RTCPArrivalTimeSecsAudio(0),
-  _RTCPArrivalTimeFracAudio(0),
-  _nackMethod(kNackOff),
-  _nackLastTimeSent(0),
-  _nackLastSeqNumberSent(0),
-  _simulcast(false),
-  _keyFrameReqMethod(kKeyFrameReqFirRtp)
+ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
+    : _rtpSender(configuration.id, configuration.audio, configuration.clock),
+      _rtpReceiver(configuration.id, configuration.audio, configuration.clock,
+                   this),
+      _rtcpSender(configuration.id, configuration.audio, configuration.clock,
+                  this),
+      _rtcpReceiver(configuration.id, configuration.clock, this),
+      _owns_clock(false),
+      _clock(*configuration.clock),
+      _id(configuration.id),
+      _audio(configuration.audio),
+      _collisionDetected(false),
+      _lastProcessTime(configuration.clock->GetTimeInMS()),
+      _lastBitrateProcessTime(configuration.clock->GetTimeInMS()),
+      _lastPacketTimeoutProcessTime(configuration.clock->GetTimeInMS()),
+      _packetOverHead(28),  // IPV4 UDP
+      _criticalSectionModulePtrs(
+          CriticalSectionWrapper::CreateCriticalSection()),
+      _criticalSectionModulePtrsFeedback(
+          CriticalSectionWrapper::CreateCriticalSection()),
+      _defaultModule(
+          static_cast<ModuleRtpRtcpImpl*>(configuration.default_module)),
+      _deadOrAliveActive(false),
+      _deadOrAliveTimeoutMS(0),
+      _deadOrAliveLastTimer(0),
+      _nackMethod(kNackOff),
+      _nackLastTimeSent(0),
+      _nackLastSeqNumberSent(0),
+      _simulcast(false),
+      _keyFrameReqMethod(kKeyFrameReqFirRtp)
 #ifdef MATLAB
-  , _plot1(NULL)
+       , _plot1(NULL)
 #endif
 {
   _sendVideoCodec.codecType = kVideoCodecUnknown;
+
+  if (_defaultModule) {
+    _defaultModule->RegisterChildModule(this);
+  }
+  // TODO(pwestin) move to constructors of each rtp/rtcp sender/receiver object.
+  _rtpReceiver.RegisterIncomingDataCallback(configuration.incoming_data);
+  _rtpReceiver.RegisterIncomingRTPCallback(configuration.incoming_messages);
+  _rtcpReceiver.RegisterRtcpObservers(configuration.intra_frame_callback,
+                                      configuration.bandwidth_callback,
+                                      configuration.rtcp_feedback);
+  _rtpSender.RegisterAudioCallback(configuration.audio_messages);
+  _rtpReceiver.RegisterIncomingAudioCallback(configuration.audio_messages);
+
+  _rtpSender.RegisterSendTransport(configuration.outgoing_transport);
+  _rtcpSender.RegisterSendTransport(configuration.outgoing_transport);
+
+  _rtcpSender.SetRemoteBitrateObserver(configuration.bitrate_observer);
+
   // make sure that RTCP objects are aware of our SSRC
   WebRtc_UWord32 SSRC = _rtpSender.SSRC();
   _rtcpSender.SetSSRC(SSRC);
 
-  WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, id, "%s created", __FUNCTION__);
+  WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s created", __FUNCTION__);
 }
 
 ModuleRtpRtcpImpl::~ModuleRtpRtcpImpl() {
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 
-  // make sure to unregister this module from other modules
+  // All child modules MUST be deleted before deleting the default.
+  assert(_childModules.empty());
 
-  const bool defaultInstance(_childModules.empty() ? false : true);
-
-  if (defaultInstance) {
-    // deregister for the default module
-    // will go in to the child modules and remove it self
-    std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
-    while (it != _childModules.end()) {
-      RtpRtcp* module = *it;
-      _childModules.erase(it);
-      if (module) {
-        module->DeRegisterDefaultModule();
-      }
-      it = _childModules.begin();
-    }
-  } else {
-    // deregister for the child modules
-    // will go in to the default and remove it self
-    DeRegisterDefaultModule();
+  // Deregister for the child modules
+  // will go in to the default and remove it self
+  if (_defaultModule) {
+    _defaultModule->DeRegisterChildModule(this);
   }
-
-  if (_audio) {
-    DeRegisterVideoModule();
-  } else {
-    DeRegisterSyncModule();
-  }
-
 #ifdef MATLAB
   if (_plot1) {
     eng.DeletePlot(_plot1);
     _plot1 = NULL;
   }
 #endif
-
-  delete _criticalSectionModulePtrs;
-  delete _criticalSectionModulePtrsFeedback;
   if (_owns_clock) {
     delete &_clock;
   }
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::ChangeUniqueId(const WebRtc_Word32 id) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "ChangeUniqueId(new id:%d)", id);
-
-  _id = id;
-
-  _rtpReceiver.ChangeUniqueId(id);
-  _rtcpReceiver.ChangeUniqueId(id);
-  _rtpSender.ChangeUniqueId(id);
-  _rtcpSender.ChangeUniqueId(id);
-  return 0;
-}
-
-// default encoder that we need to multiplex out
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterDefaultModule(RtpRtcp* module) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterDefaultModule(module:0x%x)", module);
-
-  if (module == NULL) {
-    return -1;
-  }
-  if (module == this) {
-    WEBRTC_TRACE(kTraceError,
-                 kTraceRtpRtcp,
-                 _id,
-                 "RegisterDefaultModule can't register self as default");
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-
-  if (_defaultModule) {
-    _defaultModule->DeRegisterChildModule(this);
-  }
-  _defaultModule = (ModuleRtpRtcpImpl*)module;
-  _defaultModule->RegisterChildModule(this);
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::DeRegisterDefaultModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterDefaultModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_defaultModule) {
-    _defaultModule->DeRegisterChildModule(this);
-    _defaultModule = NULL;
-  }
-  return 0;
-}
-
-bool ModuleRtpRtcpImpl::DefaultModuleRegistered() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DefaultModuleRegistered()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_defaultModule) {
-    return true;
-  }
-  return false;
-}
-
-WebRtc_UWord32 ModuleRtpRtcpImpl::NumberChildModules() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "NumberChildModules");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
-  // we use two locks for protecting _childModules one
-  // (_criticalSectionModulePtrsFeedback) for incoming  messages
-  // (BitrateSent and UpdateTMMBR) and _criticalSectionModulePtrs for
-  //  all outgoing messages sending packets etc
-
-  return _childModules.size();
-}
-
 void ModuleRtpRtcpImpl::RegisterChildModule(RtpRtcp* module) {
   WEBRTC_TRACE(kTraceModuleCall,
                kTraceRtpRtcp,
@@ -259,9 +140,9 @@
                "RegisterChildModule(module:0x%x)",
                module);
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
+  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback.get());
   // we use two locks for protecting _childModules one
   // (_criticalSectionModulePtrsFeedback) for incoming
   // messages (BitrateSent) and _criticalSectionModulePtrs
@@ -275,9 +156,9 @@
                _id,
                "DeRegisterChildModule(module:0x%x)", removeModule);
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
+  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback.get());
 
   std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
   while (it != _childModules.end()) {
@@ -290,76 +171,6 @@
   }
 }
 
-// Lip-sync between voice-video engine,
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSyncModule(RtpRtcp* audioModule) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterSyncModule(module:0x%x)",
-               audioModule);
-
-  if (audioModule == NULL) {
-    return -1;
-  }
-  if (_audio) {
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  _audioModule = (ModuleRtpRtcpImpl*)audioModule;
-  return _audioModule->RegisterVideoModule(this);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::DeRegisterSyncModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterSyncModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_audioModule) {
-    ModuleRtpRtcpImpl* audioModule = _audioModule;
-    _audioModule = NULL;
-    _receivedNTPsecsAudio = 0;
-    _receivedNTPfracAudio = 0;
-    _RTCPArrivalTimeSecsAudio = 0;
-    _RTCPArrivalTimeFracAudio = 0;
-    audioModule->DeRegisterVideoModule();
-  }
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterVideoModule(RtpRtcp* videoModule) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterVideoModule(module:0x%x)",
-               videoModule);
-
-  if (videoModule == NULL) {
-    return -1;
-  }
-  if (!_audio) {
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  _videoModule = (ModuleRtpRtcpImpl*)videoModule;
-  return 0;
-}
-
-void ModuleRtpRtcpImpl::DeRegisterVideoModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterVideoModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_videoModule) {
-    ModuleRtpRtcpImpl* videoModule = _videoModule;
-    _videoModule = NULL;
-    videoModule->DeRegisterSyncModule();
-  }
-}
-
 // returns the number of milliseconds until the module want a worker thread
 // to call Process
 WebRtc_Word32 ModuleRtpRtcpImpl::TimeUntilNextProcess() {
@@ -436,20 +247,6 @@
 *   Receiver
 */
 
-WebRtc_Word32 ModuleRtpRtcpImpl::InitReceiver() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "InitReceiver()");
-
-  _packetOverHead = 28; // default is IPV4 UDP
-  _receivedNTPsecsAudio = 0;
-  _receivedNTPfracAudio = 0;
-  _RTCPArrivalTimeSecsAudio = 0;
-  _RTCPArrivalTimeFracAudio = 0;
-
-  _rtpReceiver.Init();
-  _rtpReceiver.SetPacketOverHead(_packetOverHead);
-  return 0;
-}
-
 void ModuleRtpRtcpImpl::ProcessDeadOrAliveTimer() {
   if (_deadOrAliveActive) {
     const WebRtc_UWord32 now = _clock.GetTimeInMS();
@@ -687,7 +484,6 @@
                _id,
                "IncomingPacket(packetLength:%u)",
                incomingPacketLength);
-
   // minimum RTP is 12 bytes
   // minimum RTCP is 8 bytes (RTCP BYE)
   if (incomingPacketLength < 8 || incomingPacket == NULL) {
@@ -754,85 +550,10 @@
   }
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::IncomingAudioNTP(
-  const WebRtc_UWord32 audioReceivedNTPsecs,
-  const WebRtc_UWord32 audioReceivedNTPfrac,
-  const WebRtc_UWord32 audioRTCPArrivalTimeSecs,
-  const WebRtc_UWord32 audioRTCPArrivalTimeFrac) {
-  _receivedNTPsecsAudio = audioReceivedNTPsecs;
-  _receivedNTPfracAudio = audioReceivedNTPfrac;
-  _RTCPArrivalTimeSecsAudio = audioRTCPArrivalTimeSecs;
-  _RTCPArrivalTimeFracAudio = audioRTCPArrivalTimeFrac;
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterIncomingDataCallback(
-  RtpData* incomingDataCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterIncomingDataCallback(incomingDataCallback:0x%x)",
-               incomingDataCallback);
-
-  return _rtpReceiver.RegisterIncomingDataCallback(incomingDataCallback);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterIncomingRTPCallback(
-  RtpFeedback* incomingMessagesCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterIncomingRTPCallback(incomingMessagesCallback:0x%x)",
-               incomingMessagesCallback);
-
-  return _rtpReceiver.RegisterIncomingRTPCallback(incomingMessagesCallback);
-}
-
-void ModuleRtpRtcpImpl::RegisterRtcpObservers(
-    RtcpIntraFrameObserver* intra_frame_callback,
-    RtcpBandwidthObserver* bandwidth_callback,
-    RtcpFeedback* feedback_callback) {
-  _rtcpReceiver.RegisterRtcpObservers(intra_frame_callback, bandwidth_callback,
-                                      feedback_callback);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterAudioCallback(
-  RtpAudioFeedback* messagesCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterAudioCallback(messagesCallback:0x%x)",
-               messagesCallback);
-
-  if (_rtpSender.RegisterAudioCallback(messagesCallback) == 0) {
-    return _rtpReceiver.RegisterIncomingAudioCallback(messagesCallback);
-  }
-  return -1;
-}
-
 /**
 *   Sender
 */
 
-WebRtc_Word32 ModuleRtpRtcpImpl::InitSender() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "InitSender()");
-
-  _collisionDetected = false;
-
-  // if we are already receiving inform our sender to avoid collision
-  if (_rtpSender.Init(_rtpReceiver.SSRC()) != 0) {
-    return -1;
-  }
-  WebRtc_Word32 retVal = _rtcpSender.Init();
-
-  // make sure that RTCP objects are aware of our SSRC
-  // (it could have changed due to collision)
-  WebRtc_UWord32 SSRC = _rtpSender.SSRC();
-  _rtcpReceiver.SetSSRC(SSRC);
-  _rtcpSender.SetSSRC(SSRC);
-  return retVal;
-}
-
 WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSendPayload(
   const CodecInst& voiceCodec) {
   WEBRTC_TRACE(kTraceModuleCall,
@@ -962,7 +683,7 @@
 
   if (defaultInstance) {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -1060,7 +781,7 @@
     return _rtpSender.SendingMedia();
   }
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
   std::list<ModuleRtpRtcpImpl*>::const_iterator it = _childModules.begin();
   while (it != _childModules.end()) {
     RTPSender& rtpSender = (*it)->_rtpSender;
@@ -1072,19 +793,6 @@
   return false;
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSendTransport(
-  Transport* outgoingTransport) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterSendTransport(0x%x)", outgoingTransport);
-
-  if (_rtpSender.RegisterSendTransport(outgoingTransport) == 0) {
-    return _rtcpSender.RegisterSendTransport(outgoingTransport);
-  }
-  return -1;
-}
-
 WebRtc_Word32 ModuleRtpRtcpImpl::SendOutgoingData(
     FrameType frameType,
     WebRtc_Word8 payloadType,
@@ -1121,7 +829,7 @@
       return -1;
     }
     int idx = 0;
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     for (; idx < rtpVideoHdr->simulcastIdx; idx++) {
       it++;
@@ -1144,7 +852,7 @@
                                       NULL,
                                       &(rtpVideoHdr->codecHeader));
   } else {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     // TODO(pwestin) remove codecInfo from SendOutgoingData
     VideoCodecInformation* codecInfo = NULL;
 
@@ -1198,7 +906,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::const_iterator it =
       _childModules.begin();
     while (it != _childModules.end()) {
@@ -1563,11 +1271,6 @@
   return _rtcpSender.SetREMBData(bitrate, numberOfSSRC, SSRC);
 }
 
-bool ModuleRtpRtcpImpl::SetRemoteBitrateObserver(
-  RtpRemoteBitrateObserver* observer) {
-  return _rtcpSender.SetRemoteBitrateObserver(observer);
-}
-
 /*
  *   (IJ) Extended jitter report.
  */
@@ -1655,7 +1358,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to check all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::const_iterator it =
       _childModules.begin();
     while (it != _childModules.end()) {
@@ -1918,7 +1621,7 @@
 
   const bool haveChildModules(_childModules.empty() ? false : true);
   if (haveChildModules) {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     if (_simulcast) {
       uint32_t bitrate_remainder = bitrate;
       std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
@@ -1994,7 +1697,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
 
   if (defaultInstance) {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -2041,7 +1744,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to check all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
       RtpRtcp* module = *it;
@@ -2075,7 +1778,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance)  {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -2128,7 +1831,7 @@
 
   if (defaultInstance) {
     // for default we need to update the send bitrate
-    CriticalSectionScoped lock(_criticalSectionModulePtrsFeedback);
+    CriticalSectionScoped lock(_criticalSectionModulePtrsFeedback.get());
 
     if (totalRate != NULL)
       *totalRate = 0;
@@ -2183,66 +1886,6 @@
   return 0;
 }
 
-// for lip sync
-void ModuleRtpRtcpImpl::OnReceivedNTP() {
-  // don't do anything if we are the audio module
-  // video module is responsible for sync
-  if (!_audio) {
-    WebRtc_Word32 diff = 0;
-    WebRtc_UWord32 receivedNTPsecs = 0;
-    WebRtc_UWord32 receivedNTPfrac = 0;
-    WebRtc_UWord32 RTCPArrivalTimeSecs = 0;
-    WebRtc_UWord32 RTCPArrivalTimeFrac = 0;
-
-    if (0 == _rtcpReceiver.NTP(&receivedNTPsecs,
-                               &receivedNTPfrac,
-                               &RTCPArrivalTimeSecs,
-                               &RTCPArrivalTimeFrac)) {
-      CriticalSectionScoped lock(_criticalSectionModulePtrs);
-
-      if (_audioModule) {
-        if (0 != _audioModule->RemoteNTP(&_receivedNTPsecsAudio,
-                                         &_receivedNTPfracAudio,
-                                         &_RTCPArrivalTimeSecsAudio,
-                                         &_RTCPArrivalTimeFracAudio)) {
-          // failed ot get audio NTP
-          return;
-        }
-      }
-      if (_receivedNTPfracAudio != 0) {
-        // ReceivedNTPxxx is NTP at sender side when sent.
-        // RTCPArrivalTimexxx is NTP at receiver side when received.
-        // can't use ConvertNTPTimeToMS since calculation can be
-        //  negative
-
-        WebRtc_Word32 NTPdiff = (WebRtc_Word32)
-                                ((_receivedNTPsecsAudio - receivedNTPsecs) *
-                                 1000); // ms
-        NTPdiff += (WebRtc_Word32)
-                   (_receivedNTPfracAudio / FracMS - receivedNTPfrac / FracMS);
-
-        WebRtc_Word32 RTCPdiff =
-            static_cast<WebRtc_Word32> ((_RTCPArrivalTimeSecsAudio -
-                                         RTCPArrivalTimeSecs) * 1000);
-        RTCPdiff += (WebRtc_Word32)
-                    (_RTCPArrivalTimeFracAudio / FracMS -
-                     RTCPArrivalTimeFrac / FracMS);
-
-        diff = NTPdiff - RTCPdiff;
-        // if diff is + video is behind
-        if (diff < -1000 || diff > 1000) {
-          // unresonable ignore value.
-          diff = 0;
-          return;
-        }
-      }
-    }
-    // export via callback
-    // after release of critsect
-    _rtcpReceiver.UpdateLipSync(diff);
-  }
-}
-
 RateControlRegion ModuleRtpRtcpImpl::OnOverUseStateUpdate(
   const RateControlInput& rateControlInput) {
 
diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
index f71c9d2..8724d78 100644
--- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
@@ -13,11 +13,12 @@
 
 #include <list>
 
-#include "rtcp_receiver.h"
-#include "rtcp_sender.h"
-#include "rtp_receiver.h"
-#include "rtp_rtcp.h"
-#include "rtp_sender.h"
+#include "modules/rtp_rtcp/interface/rtp_rtcp.h"
+#include "modules/rtp_rtcp/source/rtcp_receiver.h"
+#include "modules/rtp_rtcp/source/rtcp_sender.h"
+#include "modules/rtp_rtcp/source/rtp_receiver.h"
+#include "modules/rtp_rtcp/source/rtp_sender.h"
+#include "system_wrappers/interface/scoped_ptr.h"
 
 #ifdef MATLAB
 class MatlabPlot;
@@ -25,34 +26,12 @@
 
 namespace webrtc {
 
-class ModuleRtpRtcpImpl : public RtpRtcp
-{
-public:
-    ModuleRtpRtcpImpl(const WebRtc_Word32 id,
-                      const bool audio,
-                      RtpRtcpClock* clock);
+class ModuleRtpRtcpImpl : public RtpRtcp {
+ public:
+    explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration);
 
     virtual ~ModuleRtpRtcpImpl();
 
-    // get Module ID
-    WebRtc_Word32 Id()   {return _id;}
-
-    virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id);
-
-    // De-muxing functionality for
-    virtual WebRtc_Word32 RegisterDefaultModule(RtpRtcp* module);
-    virtual WebRtc_Word32 DeRegisterDefaultModule();
-    virtual bool DefaultModuleRegistered();
-
-    virtual WebRtc_UWord32 NumberChildModules();
-
-    // Lip-sync between voice-video
-    virtual WebRtc_Word32 RegisterSyncModule(RtpRtcp* module);
-    virtual WebRtc_Word32 DeRegisterSyncModule();
-
-    virtual WebRtc_Word32 RegisterVideoModule(RtpRtcp* videoModule);
-    virtual void DeRegisterVideoModule();
-
     // returns the number of milliseconds until the module want a worker thread to call Process
     virtual WebRtc_Word32 TimeUntilNextProcess();
 
@@ -62,8 +41,6 @@
     /**
     *   Receiver
     */
-    virtual WebRtc_Word32 InitReceiver();
-
     // configure a timeout value
     virtual WebRtc_Word32 SetPacketTimeout(const WebRtc_UWord32 RTPtimeoutMS,
                                            const WebRtc_UWord32 RTCPtimeoutMS);
@@ -125,31 +102,9 @@
     virtual WebRtc_Word32 IncomingPacket( const WebRtc_UWord8* incomingPacket,
                                         const WebRtc_UWord16 packetLength);
 
-    virtual WebRtc_Word32 IncomingAudioNTP(const WebRtc_UWord32 audioReceivedNTPsecs,
-                                         const WebRtc_UWord32 audioReceivedNTPfrac,
-                                         const WebRtc_UWord32 audioRTCPArrivalTimeSecs,
-                                         const WebRtc_UWord32 audioRTCPArrivalTimeFrac);
-
-    // Used by the module to deliver the incoming data to the codec module
-    virtual WebRtc_Word32 RegisterIncomingDataCallback(
-        RtpData* incomingDataCallback);
-
-    // Used by the module to deliver messages to the codec module/appliation
-    virtual WebRtc_Word32 RegisterIncomingRTPCallback(
-        RtpFeedback* incomingMessagesCallback);
-
-    virtual void RegisterRtcpObservers(
-        RtcpIntraFrameObserver* intraFrameCallback,
-        RtcpBandwidthObserver* bandwidthCallback,
-        RtcpFeedback* callback);
-
-    virtual WebRtc_Word32 RegisterAudioCallback(RtpAudioFeedback* messagesCallback);
-
     /**
     *   Sender
     */
-    virtual WebRtc_Word32 InitSender();
-
     virtual WebRtc_Word32 RegisterSendPayload(const CodecInst& voiceCodec);
 
     virtual WebRtc_Word32 RegisterSendPayload(const VideoCodec& videoCodec);
@@ -216,9 +171,6 @@
 
     virtual bool SendingMedia() const;
 
-    // Used by the module to send RTP and RTCP packet to the network module
-    virtual WebRtc_Word32 RegisterSendTransport(Transport* outgoingTransport);
-
     // Used by the codec module to deliver a video or audio frame for packetization
     virtual WebRtc_Word32 SendOutgoingData(
         const FrameType frameType,
@@ -325,7 +277,6 @@
                                       const WebRtc_UWord8 numberOfSSRC,
                                       const WebRtc_UWord32* SSRC);
 
-    virtual bool SetRemoteBitrateObserver(RtpRemoteBitrateObserver* observer);
     /*
     *   (IJ) Extended jitter report.
     */
@@ -482,8 +433,6 @@
     // good state of RTP receiver inform sender
     virtual WebRtc_Word32 SendRTCPReferencePictureSelection(const WebRtc_UWord64 pictureID);
 
-    void OnReceivedNTP() ;
-
     void OnReceivedTMMBR();
 
     // bad state of RTP receiver request a keyframe
@@ -539,23 +488,15 @@
     WebRtc_UWord32            _lastPacketTimeoutProcessTime;
     WebRtc_UWord16            _packetOverHead;
 
-    CriticalSectionWrapper*       _criticalSectionModulePtrs;
-    CriticalSectionWrapper*       _criticalSectionModulePtrsFeedback;
+    scoped_ptr<CriticalSectionWrapper> _criticalSectionModulePtrs;
+    scoped_ptr<CriticalSectionWrapper> _criticalSectionModulePtrsFeedback;
     ModuleRtpRtcpImpl*            _defaultModule;
-    ModuleRtpRtcpImpl*            _audioModule;
-    ModuleRtpRtcpImpl*            _videoModule;
     std::list<ModuleRtpRtcpImpl*> _childModules;
 
     // Dead or alive
     bool                  _deadOrAliveActive;
     WebRtc_UWord32        _deadOrAliveTimeoutMS;
     WebRtc_UWord32        _deadOrAliveLastTimer;
-
-    WebRtc_UWord32        _receivedNTPsecsAudio;
-    WebRtc_UWord32        _receivedNTPfracAudio;
-    WebRtc_UWord32        _RTCPArrivalTimeSecsAudio;
-    WebRtc_UWord32        _RTCPArrivalTimeFracAudio;
-
     // send side
     NACKMethod            _nackMethod;
     WebRtc_UWord32        _nackLastTimeSent;
diff --git a/src/modules/rtp_rtcp/source/rtp_sender.cc b/src/modules/rtp_rtcp/source/rtp_sender.cc
index e877692b..945171c 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender.cc
@@ -117,7 +117,7 @@
 
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 }
-
+/*
 WebRtc_Word32
 RTPSender::Init(const WebRtc_UWord32 remoteSSRC)
 {
@@ -173,19 +173,7 @@
     }
     return(0);
 }
-
-void
-RTPSender::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-    if(_audioConfigured)
-    {
-        _audio->ChangeUniqueId(id);
-    } else
-    {
-        _video->ChangeUniqueId(id);
-    }
-}
+*/
 
 void RTPSender::SetTargetSendBitrate(const WebRtc_UWord32 bits) {
   _targetSendBitrate = static_cast<uint16_t>(bits / 1000);
diff --git a/src/modules/rtp_rtcp/source/rtp_sender.h b/src/modules/rtp_rtcp/source/rtp_sender.h
index 3906e8c..37eec48 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender.h
@@ -68,9 +68,6 @@
     RTPSender(const WebRtc_Word32 id, const bool audio, RtpRtcpClock* clock);
     virtual ~RTPSender();
 
-    WebRtc_Word32 Init(const WebRtc_UWord32 remoteSSRC);
-    void ChangeUniqueId(const WebRtc_Word32 id);
-
     void ProcessBitrate();
     void ProcessSendToNetwork();
 
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_audio.cc b/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
index ee3c414..361aea5 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -51,30 +51,6 @@
 }
 
 WebRtc_Word32
-RTPSenderAudio::Init()
-{
-    CriticalSectionScoped cs(_sendAudioCritsect);
-
-    _dtmfPayloadType = -1;
-    _inbandVADactive = false;
-    _cngNBPayloadType = -1;
-    _cngWBPayloadType = -1;
-    _cngSWBPayloadType = -1;
-    _lastPayloadType = -1;
-    _REDPayloadType = -1;
-    _dtmfTimeLastSent = 0;
-    _dtmfTimestampLastSent = 0;
-    ResetDTMF();
-    return 0;
-}
-
-void
-RTPSenderAudio::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
-WebRtc_Word32
 RTPSenderAudio::RegisterAudioCallback(RtpAudioFeedback* messagesCallback)
 {
     CriticalSectionScoped cs(_audioFeedbackCritsect);
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_audio.h b/src/modules/rtp_rtcp/source/rtp_sender_audio.h
index 5fda2ef..1ea2fab 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_audio.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender_audio.h
@@ -28,10 +28,6 @@
                    RTPSenderInterface* rtpSender);
     virtual ~RTPSenderAudio();
 
-    void ChangeUniqueId(const WebRtc_Word32 id);
-
-    WebRtc_Word32 Init();
-
     WebRtc_Word32 RegisterAudioPayload(
         const char payloadName[RTP_PAYLOAD_NAME_SIZE],
         const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_video.cc b/src/modules/rtp_rtcp/source/rtp_sender_video.cc
index 8f44973..f1e3c74 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -67,29 +67,6 @@
     delete _sendVideoCritsect;
 }
 
-WebRtc_Word32
-RTPSenderVideo::Init()
-{
-    CriticalSectionScoped cs(_sendVideoCritsect);
-
-    _retransmissionSettings = kRetransmitBaseLayer;
-    _fecEnabled = false;
-    _payloadTypeRED = -1;
-    _payloadTypeFEC = -1;
-    _numberFirstPartition = 0;
-    memset(&delta_fec_params_, 0, sizeof(delta_fec_params_));
-    memset(&key_fec_params_, 0, sizeof(key_fec_params_));
-    delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1;
-    _fecOverheadRate.Init();
-    return 0;
-}
-
-void
-RTPSenderVideo::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
 void
 RTPSenderVideo::SetVideoCodecType(RtpVideoCodecTypes videoType)
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_video.h b/src/modules/rtp_rtcp/source/rtp_sender_video.h
index 18f39ca..5c3f70c 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_video.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender_video.h
@@ -37,10 +37,6 @@
                    RTPSenderInterface* rtpSender);
     virtual ~RTPSenderVideo();
 
-    WebRtc_Word32 Init();
-
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
     virtual RtpVideoCodecTypes VideoCodecType() const;
 
     WebRtc_UWord16 FECPacketOverhead() const;