diff --git a/webrtc/modules/rtp_rtcp/interface/receive_statistics.h b/webrtc/modules/rtp_rtcp/interface/receive_statistics.h index 4cc069a93..07288c4db 100644 --- a/webrtc/modules/rtp_rtcp/interface/receive_statistics.h +++ b/webrtc/modules/rtp_rtcp/interface/receive_statistics.h @@ -69,5 +69,18 @@ class ReceiveStatistics : public Module { virtual StreamStatistician* GetStatistician(uint32_t ssrc) const = 0; }; +class NullReceiveStatistics : public ReceiveStatistics { + public: + virtual void IncomingPacket(const RTPHeader& rtp_header, size_t bytes, + bool retransmitted, bool in_order) {} + virtual void GetActiveStatisticians( + StatisticianMap* statisticians) const { statisticians->clear(); } + virtual StreamStatistician* GetStatistician(uint32_t ssrc) const { + return NULL; + } + virtual int32_t TimeUntilNextProcess() { return 0; } + virtual int32_t Process() { return 0; } +}; + } // namespace webrtc #endif // WEBRTC_MODULES_RTP_RTCP_INTERFACE_RECEIVE_STATISTICS_H_ diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc index c3bc8f5e4..de6eb0045 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc @@ -1689,14 +1689,12 @@ int RTCPSender::PrepareRTCP( // If the data does not fit in the packet we fill it as much as possible. int32_t buildVal = 0; + // We need to send our NTP even if we haven't received any reports. + _clock->CurrentNtp(NTPsec, NTPfrac); if (ShouldSendReportBlocks(rtcpPacketTypeFlags)) { ReceiveStatistics::StatisticianMap statisticians; receive_statistics_->GetActiveStatisticians(&statisticians); - if (statisticians.empty()) { - // We need to send our NTP even if we dont have received any - // reports. - _clock->CurrentNtp(NTPsec, NTPfrac); - } else { + if (!statisticians.empty()) { ReceiveStatistics::StatisticianMap::const_iterator it; int i; for (it = statisticians.begin(), i = 0; it != statisticians.end(); @@ -1705,9 +1703,8 @@ int RTCPSender::PrepareRTCP( if (PrepareReport(it->second, &report_block, &NTPsec, &NTPfrac)) AddReportBlock(it->first, &internal_report_blocks_, &report_block); } - if (_IJ && !statisticians.empty()) - { - rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; + if (_IJ && !statisticians.empty()) { + rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; } _lastRTCPTime[0] = Clock::NtpToMs(NTPsec, NTPfrac); } diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index 2a1c3d52e..ea4bfcba3 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -41,7 +41,7 @@ RtpRtcp::Configuration::Configuration() audio(false), clock(NULL), default_module(NULL), - receive_statistics(), + receive_statistics(NullObjectReceiveStatistics()), outgoing_transport(NULL), rtcp_feedback(NULL), intra_frame_callback(NULL), diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc index 25afd73d7..3fdbfe071 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc @@ -61,6 +61,11 @@ RtpAudioFeedback* NullObjectRtpAudioFeedback() { return &null_rtp_audio_feedback; } +ReceiveStatistics* NullObjectReceiveStatistics() { + static NullReceiveStatistics null_receive_statistics; + return &null_receive_statistics; +} + namespace ModuleRTPUtility { enum { diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.h b/webrtc/modules/rtp_rtcp/source/rtp_utility.h index e95830eff..baf70fae2 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_utility.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.h @@ -14,6 +14,7 @@ #include // size_t, ptrdiff_t #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" +#include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" #include "webrtc/typedefs.h" @@ -25,6 +26,7 @@ const uint8_t kRtpMarkerBitMask = 0x80; RtpData* NullObjectRtpData(); RtpFeedback* NullObjectRtpFeedback(); RtpAudioFeedback* NullObjectRtpAudioFeedback(); +ReceiveStatistics* NullObjectReceiveStatistics(); namespace ModuleRTPUtility {