diff options
Diffstat (limited to 'webrtc/modules/rtp_rtcp/source/rtcp_receiver.h')
-rw-r--r-- | webrtc/modules/rtp_rtcp/source/rtcp_receiver.h | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h new file mode 100644 index 0000000000..272397675b --- /dev/null +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h @@ -0,0 +1,326 @@ +/* + * 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 + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_ +#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_ + +#include <map> +#include <vector> +#include <set> + +#include "webrtc/base/thread_annotations.h" +#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver_help.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" +#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" +#include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h" +#include "webrtc/typedefs.h" + +namespace webrtc { +class ModuleRtpRtcpImpl; + +class RTCPReceiver : public TMMBRHelp +{ +public: + RTCPReceiver(Clock* clock, + bool receiver_only, + RtcpPacketTypeCounterObserver* packet_type_counter_observer, + RtcpBandwidthObserver* rtcp_bandwidth_observer, + RtcpIntraFrameObserver* rtcp_intra_frame_observer, + TransportFeedbackObserver* transport_feedback_observer, + ModuleRtpRtcpImpl* owner); + virtual ~RTCPReceiver(); + + RtcpMode Status() const; + void SetRTCPStatus(RtcpMode method); + + int64_t LastReceived(); + int64_t LastReceivedReceiverReport() const; + + void SetSsrcs(uint32_t main_ssrc, + const std::set<uint32_t>& registered_ssrcs); + void SetRelaySSRC(uint32_t ssrc); + void SetRemoteSSRC(uint32_t ssrc); + uint32_t RemoteSSRC() const; + + uint32_t RelaySSRC() const; + + int32_t IncomingRTCPPacket( + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation, + RTCPUtility::RTCPParserV2 *rtcpParser); + + void TriggerCallbacksFromRTCPPacket( + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation); + + // get received cname + int32_t CNAME(uint32_t remoteSSRC, char cName[RTCP_CNAME_SIZE]) const; + + // get received NTP + bool NTP(uint32_t* ReceivedNTPsecs, + uint32_t* ReceivedNTPfrac, + uint32_t* RTCPArrivalTimeSecs, + uint32_t* RTCPArrivalTimeFrac, + uint32_t* rtcp_timestamp) const; + + bool LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo* info) const; + + // get rtt + int32_t RTT(uint32_t remoteSSRC, + int64_t* RTT, + int64_t* avgRTT, + int64_t* minRTT, + int64_t* maxRTT) const; + + int32_t SenderInfoReceived(RTCPSenderInfo* senderInfo) const; + + bool GetAndResetXrRrRtt(int64_t* rtt_ms); + + // get statistics + int32_t StatisticsReceived( + std::vector<RTCPReportBlock>* receiveBlocks) const; + + // Returns true if we haven't received an RTCP RR for several RTCP + // intervals, but only triggers true once. + bool RtcpRrTimeout(int64_t rtcp_interval_ms); + + // Returns true if we haven't received an RTCP RR telling the receive side + // has not received RTP packets for too long, i.e. extended highest sequence + // number hasn't increased for several RTCP intervals. The function only + // returns true once until a new RR is received. + bool RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms); + + // Get TMMBR + int32_t TMMBRReceived(uint32_t size, + uint32_t accNumCandidates, + TMMBRSet* candidateSet) const; + + bool UpdateRTCPReceiveInformationTimers(); + + int32_t BoundingSet(bool &tmmbrOwner, TMMBRSet* boundingSetRec); + + int32_t UpdateTMMBR(); + + void RegisterRtcpStatisticsCallback(RtcpStatisticsCallback* callback); + RtcpStatisticsCallback* GetRtcpStatisticsCallback(); + +protected: + RTCPUtility::RTCPCnameInformation* CreateCnameInformation(uint32_t remoteSSRC); + RTCPUtility::RTCPCnameInformation* GetCnameInformation( + uint32_t remoteSSRC) const; + + RTCPHelp::RTCPReceiveInformation* CreateReceiveInformation( + uint32_t remoteSSRC); + RTCPHelp::RTCPReceiveInformation* GetReceiveInformation(uint32_t remoteSSRC); + + void UpdateReceiveInformation( + RTCPHelp::RTCPReceiveInformation& receiveInformation); + + void HandleSenderReceiverReport( + RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleReportBlock( + const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation, + uint32_t remoteSSRC) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleXrHeader(RTCPUtility::RTCPParserV2& parser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleXrReceiveReferenceTime( + RTCPUtility::RTCPParserV2& parser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleXrDlrrReportBlock( + RTCPUtility::RTCPParserV2& parser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleXrDlrrReportBlockItem( + const RTCPUtility::RTCPPacket& packet, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleXRVOIPMetric( + RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleREMBItem(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleTMMBRItem(RTCPHelp::RTCPReceiveInformation& receiveInfo, + const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation, + uint32_t senderSSRC) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleSR_REQ(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleTMMBNItem(RTCPHelp::RTCPReceiveInformation& receiveInfo, + const RTCPUtility::RTCPPacket& rtcpPacket) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleFIRItem(RTCPHelp::RTCPReceiveInformation* receiveInfo, + const RTCPUtility::RTCPPacket& rtcpPacket, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleAPP(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser, + RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + void HandleTransportFeedback( + RTCPUtility::RTCPParserV2* rtcp_parser, + RTCPHelp::RTCPPacketInformation* rtcp_packet_information) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + private: + typedef std::map<uint32_t, RTCPHelp::RTCPReceiveInformation*> + ReceivedInfoMap; + // RTCP report block information mapped by remote SSRC. + typedef std::map<uint32_t, RTCPHelp::RTCPReportBlockInformation*> + ReportBlockInfoMap; + // RTCP report block information map mapped by source SSRC. + typedef std::map<uint32_t, ReportBlockInfoMap> ReportBlockMap; + + RTCPHelp::RTCPReportBlockInformation* CreateOrGetReportBlockInformation( + uint32_t remote_ssrc, uint32_t source_ssrc) + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + RTCPHelp::RTCPReportBlockInformation* GetReportBlockInformation( + uint32_t remote_ssrc, uint32_t source_ssrc) const + EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver); + + Clock* const _clock; + const bool receiver_only_; + RtcpMode _method; + int64_t _lastReceived; + ModuleRtpRtcpImpl& _rtpRtcp; + + CriticalSectionWrapper* _criticalSectionFeedbacks; + RtcpBandwidthObserver* const _cbRtcpBandwidthObserver; + RtcpIntraFrameObserver* const _cbRtcpIntraFrameObserver; + TransportFeedbackObserver* const _cbTransportFeedbackObserver; + + CriticalSectionWrapper* _criticalSectionRTCPReceiver; + uint32_t main_ssrc_ GUARDED_BY(_criticalSectionRTCPReceiver); + uint32_t _remoteSSRC GUARDED_BY(_criticalSectionRTCPReceiver); + std::set<uint32_t> registered_ssrcs_ GUARDED_BY(_criticalSectionRTCPReceiver); + + // Received send report + RTCPSenderInfo _remoteSenderInfo; + // when did we receive the last send report + uint32_t _lastReceivedSRNTPsecs; + uint32_t _lastReceivedSRNTPfrac; + + // Received XR receive time report. + RtcpReceiveTimeInfo _remoteXRReceiveTimeInfo; + // Time when the report was received. + uint32_t _lastReceivedXRNTPsecs; + uint32_t _lastReceivedXRNTPfrac; + // Estimated rtt, zero when there is no valid estimate. + int64_t xr_rr_rtt_ms_; + + // Received report blocks. + ReportBlockMap _receivedReportBlockMap + GUARDED_BY(_criticalSectionRTCPReceiver); + ReceivedInfoMap _receivedInfoMap; + std::map<uint32_t, RTCPUtility::RTCPCnameInformation*> _receivedCnameMap; + + uint32_t _packetTimeOutMS; + + // The last time we received an RTCP RR. + int64_t _lastReceivedRrMs; + + // The time we last received an RTCP RR telling we have successfully + // delivered RTP packet to the remote side. + int64_t _lastIncreasedSequenceNumberMs; + + RtcpStatisticsCallback* stats_callback_ GUARDED_BY(_criticalSectionFeedbacks); + + RtcpPacketTypeCounterObserver* const packet_type_counter_observer_; + RtcpPacketTypeCounter packet_type_counter_; + + RTCPUtility::NackStats nack_stats_; + + size_t num_skipped_packets_; + int64_t last_skipped_packets_warning_; +}; +} // namespace webrtc +#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_ |