LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/modules/rtp_rtcp/source - rtcp_utility.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 7 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             : *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
       3             : *
       4             : *  Use of this source code is governed by a BSD-style license
       5             : *  that can be found in the LICENSE file in the root of the source
       6             : *  tree. An additional intellectual property rights grant can be found
       7             : *  in the file PATENTS.  All contributing project authors may
       8             : *  be found in the AUTHORS file in the root of the source tree.
       9             : */
      10             : 
      11             : #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
      12             : #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
      13             : 
      14             : #include <stddef.h> // size_t, ptrdiff_t
      15             : 
      16             : #include <memory>
      17             : 
      18             : #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
      19             : #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
      20             : #include "webrtc/typedefs.h"
      21             : 
      22             : namespace webrtc {
      23             : namespace rtcp {
      24             : class RtcpPacket;
      25             : }
      26             : namespace RTCPUtility {
      27             : 
      28             : class NackStats {
      29             :  public:
      30             :   NackStats();
      31             :   ~NackStats();
      32             : 
      33             :   // Updates stats with requested sequence number.
      34             :   // This function should be called for each NACK request to calculate the
      35             :   // number of unique NACKed RTP packets.
      36             :   void ReportRequest(uint16_t sequence_number);
      37             : 
      38             :   // Gets the number of NACKed RTP packets.
      39           0 :   uint32_t requests() const { return requests_; }
      40             : 
      41             :   // Gets the number of unique NACKed RTP packets.
      42           0 :   uint32_t unique_requests() const { return unique_requests_; }
      43             : 
      44             :  private:
      45             :   uint16_t max_sequence_number_;
      46             :   uint32_t requests_;
      47             :   uint32_t unique_requests_;
      48             : };
      49             : 
      50             : uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
      51             : 
      52             : struct RTCPPacketRR {
      53             :   uint32_t SenderSSRC;
      54             :   uint8_t NumberOfReportBlocks;
      55             : };
      56             : struct RTCPPacketSR {
      57             :   uint32_t SenderSSRC;
      58             :   uint8_t NumberOfReportBlocks;
      59             : 
      60             :   // sender info
      61             :   uint32_t NTPMostSignificant;
      62             :   uint32_t NTPLeastSignificant;
      63             :   uint32_t RTPTimestamp;
      64             :   uint32_t SenderPacketCount;
      65             :   uint32_t SenderOctetCount;
      66             : };
      67             : struct RTCPPacketReportBlockItem {
      68             :   // report block
      69             :   uint32_t SSRC;
      70             :   uint8_t FractionLost;
      71             :   uint32_t CumulativeNumOfPacketsLost;
      72             :   uint32_t ExtendedHighestSequenceNumber;
      73             :   uint32_t Jitter;
      74             :   uint32_t LastSR;
      75             :   uint32_t DelayLastSR;
      76             : };
      77             : struct RTCPPacketSDESCName {
      78             :   // RFC3550
      79             :   uint32_t SenderSSRC;
      80             :   char CName[RTCP_CNAME_SIZE];
      81             : };
      82             : 
      83             : struct RTCPPacketExtendedJitterReportItem {
      84             :   // RFC 5450
      85             :   uint32_t Jitter;
      86             : };
      87             : 
      88             : struct RTCPPacketBYE {
      89             :   uint32_t SenderSSRC;
      90             : };
      91             : struct RTCPPacketXR {
      92             :   // RFC 3611
      93             :   uint32_t OriginatorSSRC;
      94             : };
      95             : struct RTCPPacketXRReceiverReferenceTimeItem {
      96             :   // RFC 3611 4.4
      97             :   uint32_t NTPMostSignificant;
      98             :   uint32_t NTPLeastSignificant;
      99             : };
     100             : struct RTCPPacketXRDLRRReportBlockItem {
     101             :   // RFC 3611 4.5
     102             :   uint32_t SSRC;
     103             :   uint32_t LastRR;
     104             :   uint32_t DelayLastRR;
     105             : };
     106             : struct RTCPPacketXRVOIPMetricItem {
     107             :   // RFC 3611 4.7
     108             :   uint32_t SSRC;
     109             :   uint8_t lossRate;
     110             :   uint8_t discardRate;
     111             :   uint8_t burstDensity;
     112             :   uint8_t gapDensity;
     113             :   uint16_t burstDuration;
     114             :   uint16_t gapDuration;
     115             :   uint16_t roundTripDelay;
     116             :   uint16_t endSystemDelay;
     117             :   uint8_t signalLevel;
     118             :   uint8_t noiseLevel;
     119             :   uint8_t RERL;
     120             :   uint8_t Gmin;
     121             :   uint8_t Rfactor;
     122             :   uint8_t extRfactor;
     123             :   uint8_t MOSLQ;
     124             :   uint8_t MOSCQ;
     125             :   uint8_t RXconfig;
     126             :   uint16_t JBnominal;
     127             :   uint16_t JBmax;
     128             :   uint16_t JBabsMax;
     129             : };
     130             : 
     131             : struct RTCPPacketRTPFBNACK {
     132             :   uint32_t SenderSSRC;
     133             :   uint32_t MediaSSRC;
     134             : };
     135             : struct RTCPPacketRTPFBNACKItem {
     136             :   // RFC4585
     137             :   uint16_t PacketID;
     138             :   uint16_t BitMask;
     139             : };
     140             : 
     141             : struct RTCPPacketRTPFBTMMBR {
     142             :   uint32_t SenderSSRC;
     143             :   uint32_t MediaSSRC;  // zero!
     144             : };
     145             : struct RTCPPacketRTPFBTMMBRItem {
     146             :   // RFC5104
     147             :   uint32_t SSRC;
     148             :   uint32_t MaxTotalMediaBitRate;  // In Kbit/s
     149             :   uint32_t MeasuredOverhead;
     150             : };
     151             : 
     152             : struct RTCPPacketRTPFBTMMBN {
     153             :   uint32_t SenderSSRC;
     154             :   uint32_t MediaSSRC;  // zero!
     155             : };
     156             : struct RTCPPacketRTPFBTMMBNItem {
     157             :   // RFC5104
     158             :   uint32_t SSRC;  // "Owner"
     159             :   uint32_t MaxTotalMediaBitRate;
     160             :   uint32_t MeasuredOverhead;
     161             : };
     162             : 
     163             : struct RTCPPacketPSFBFIR {
     164             :   uint32_t SenderSSRC;
     165             :   uint32_t MediaSSRC;  // zero!
     166             : };
     167             : struct RTCPPacketPSFBFIRItem {
     168             :   // RFC5104
     169             :   uint32_t SSRC;
     170             :   uint8_t CommandSequenceNumber;
     171             : };
     172             : 
     173             : struct RTCPPacketPSFBPLI {
     174             :   // RFC4585
     175             :   uint32_t SenderSSRC;
     176             :   uint32_t MediaSSRC;
     177             : };
     178             : 
     179             : struct RTCPPacketPSFBSLI {
     180             :   // RFC4585
     181             :   uint32_t SenderSSRC;
     182             :   uint32_t MediaSSRC;
     183             : };
     184             : struct RTCPPacketPSFBSLIItem {
     185             :   // RFC4585
     186             :   uint16_t FirstMB;
     187             :   uint16_t NumberOfMB;
     188             :   uint8_t PictureId;
     189             : };
     190             : struct RTCPPacketPSFBRPSI {
     191             :   // RFC4585
     192             :   uint32_t SenderSSRC;
     193             :   uint32_t MediaSSRC;
     194             :   uint8_t PayloadType;
     195             :   uint16_t NumberOfValidBits;
     196             :   uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
     197             : };
     198             : struct RTCPPacketPSFBAPP {
     199             :   uint32_t SenderSSRC;
     200             :   uint32_t MediaSSRC;
     201             : };
     202             : struct RTCPPacketPSFBREMBItem {
     203             :   uint32_t BitRate;
     204             :   uint8_t NumberOfSSRCs;
     205             :   uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
     206             : };
     207             : // generic name APP
     208             : struct RTCPPacketAPP {
     209             :   uint8_t SubType;
     210             :   uint32_t Name;
     211             :   uint8_t Data[kRtcpAppCode_DATA_SIZE];
     212             :   uint16_t Size;
     213             : };
     214             : 
     215             : union RTCPPacket {
     216             :   RTCPPacketRR RR;
     217             :   RTCPPacketSR SR;
     218             :   RTCPPacketReportBlockItem ReportBlockItem;
     219             : 
     220             :   RTCPPacketSDESCName CName;
     221             :   RTCPPacketBYE BYE;
     222             : 
     223             :   RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
     224             : 
     225             :   RTCPPacketRTPFBNACK NACK;
     226             :   RTCPPacketRTPFBNACKItem NACKItem;
     227             : 
     228             :   RTCPPacketPSFBPLI PLI;
     229             :   RTCPPacketPSFBSLI SLI;
     230             :   RTCPPacketPSFBSLIItem SLIItem;
     231             :   RTCPPacketPSFBRPSI RPSI;
     232             :   RTCPPacketPSFBAPP PSFBAPP;
     233             :   RTCPPacketPSFBREMBItem REMBItem;
     234             : 
     235             :   RTCPPacketRTPFBTMMBR TMMBR;
     236             :   RTCPPacketRTPFBTMMBRItem TMMBRItem;
     237             :   RTCPPacketRTPFBTMMBN TMMBN;
     238             :   RTCPPacketRTPFBTMMBNItem TMMBNItem;
     239             :   RTCPPacketPSFBFIR FIR;
     240             :   RTCPPacketPSFBFIRItem FIRItem;
     241             : 
     242             :   RTCPPacketXR XR;
     243             :   RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
     244             :   RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
     245             :   RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
     246             : 
     247             :   RTCPPacketAPP APP;
     248             : };
     249             : 
     250             : enum class RTCPPacketTypes {
     251             :   kInvalid,
     252             : 
     253             :   // RFC3550
     254             :   kRr,
     255             :   kSr,
     256             :   kReportBlockItem,
     257             : 
     258             :   kSdes,
     259             :   kSdesChunk,
     260             :   kBye,
     261             : 
     262             :   // RFC5450
     263             :   kExtendedIj,
     264             :   kExtendedIjItem,
     265             : 
     266             :   // RFC4585
     267             :   kRtpfbNack,
     268             :   kRtpfbNackItem,
     269             : 
     270             :   kPsfbPli,
     271             :   kPsfbRpsi,
     272             :   kPsfbRpsiItem,
     273             :   kPsfbSli,
     274             :   kPsfbSliItem,
     275             :   kPsfbApp,
     276             :   kPsfbRemb,
     277             :   kPsfbRembItem,
     278             : 
     279             :   // RFC5104
     280             :   kRtpfbTmmbr,
     281             :   kRtpfbTmmbrItem,
     282             :   kRtpfbTmmbn,
     283             :   kRtpfbTmmbnItem,
     284             :   kPsfbFir,
     285             :   kPsfbFirItem,
     286             : 
     287             :   // draft-perkins-avt-rapid-rtp-sync
     288             :   kRtpfbSrReq,
     289             : 
     290             :   // RFC 3611
     291             :   kXrHeader,
     292             :   kXrReceiverReferenceTime,
     293             :   kXrDlrrReportBlock,
     294             :   kXrDlrrReportBlockItem,
     295             :   kXrVoipMetric,
     296             : 
     297             :   kApp,
     298             :   kAppItem,
     299             : 
     300             :   // draft-holmer-rmcat-transport-wide-cc-extensions
     301             :   kTransportFeedback,
     302             : };
     303             : 
     304             : struct RTCPRawPacket {
     305             :   const uint8_t* _ptrPacketBegin;
     306             :   const uint8_t* _ptrPacketEnd;
     307             : };
     308             : 
     309             : struct RTCPModRawPacket {
     310             :   uint8_t* _ptrPacketBegin;
     311             :   uint8_t* _ptrPacketEnd;
     312             : };
     313             : 
     314             : struct RtcpCommonHeader {
     315             :   static const uint8_t kHeaderSizeBytes = 4;
     316           0 :   RtcpCommonHeader()
     317           0 :       : version(2),
     318             :         count_or_format(0),
     319             :         packet_type(0),
     320             :         payload_size_bytes(0),
     321           0 :         padding_bytes(0) {}
     322             : 
     323           0 :   uint32_t BlockSize() const {
     324           0 :     return kHeaderSizeBytes + payload_size_bytes + padding_bytes;
     325             :   }
     326             : 
     327             :   uint8_t version;
     328             :   uint8_t count_or_format;
     329             :   uint8_t packet_type;
     330             :   uint32_t payload_size_bytes;
     331             :   uint8_t padding_bytes;
     332             : };
     333             : 
     334             : enum RTCPPT : uint8_t {
     335             :   PT_IJ = 195,
     336             :   PT_SR = 200,
     337             :   PT_RR = 201,
     338             :   PT_SDES = 202,
     339             :   PT_BYE = 203,
     340             :   PT_APP = 204,
     341             :   PT_RTPFB = 205,
     342             :   PT_PSFB = 206,
     343             :   PT_XR = 207
     344             : };
     345             : 
     346             : // Extended report blocks, RFC 3611.
     347             : enum RtcpXrBlockType : uint8_t {
     348             :   kBtReceiverReferenceTime = 4,
     349             :   kBtDlrr = 5,
     350             :   kBtVoipMetric = 7
     351             : };
     352             : 
     353             : bool RtcpParseCommonHeader(const uint8_t* buffer,
     354             :                            size_t size_bytes,
     355             :                            RtcpCommonHeader* parsed_header);
     356             : 
     357             : class RTCPParserV2 {
     358             :  public:
     359             :   RTCPParserV2(
     360             :       const uint8_t* rtcpData,
     361             :       size_t rtcpDataLength,
     362             :       bool rtcpReducedSizeEnable);  // Set to true, to allow non-compound RTCP!
     363             :   ~RTCPParserV2();
     364             : 
     365             :   RTCPPacketTypes PacketType() const;
     366             :   const RTCPPacket& Packet() const;
     367             :   rtcp::RtcpPacket* ReleaseRtcpPacket();
     368             :   const RTCPRawPacket& RawPacket() const;
     369             :   ptrdiff_t LengthLeft() const;
     370             : 
     371             :   bool IsValid() const;
     372             :   size_t NumSkippedBlocks() const;
     373             : 
     374             :   RTCPPacketTypes Begin();
     375             :   RTCPPacketTypes Iterate();
     376             : 
     377             :  private:
     378             :   enum class ParseState {
     379             :     State_TopLevel,            // Top level packet
     380             :     State_ReportBlockItem,     // SR/RR report block
     381             :     State_SDESChunk,           // SDES chunk
     382             :     State_BYEItem,             // BYE item
     383             :     State_ExtendedJitterItem,  // Extended jitter report item
     384             :     State_RTPFB_NACKItem,      // NACK FCI item
     385             :     State_RTPFB_TMMBRItem,     // TMMBR FCI item
     386             :     State_RTPFB_TMMBNItem,     // TMMBN FCI item
     387             :     State_PSFB_SLIItem,        // SLI FCI item
     388             :     State_PSFB_RPSIItem,       // RPSI FCI item
     389             :     State_PSFB_FIRItem,        // FIR FCI item
     390             :     State_PSFB_AppItem,        // Application specific FCI item
     391             :     State_PSFB_REMBItem,       // Application specific REMB item
     392             :     State_XRItem,
     393             :     State_XR_DLLRItem,
     394             :     State_AppItem
     395             :   };
     396             : 
     397             :  private:
     398             :   void IterateTopLevel();
     399             :   void IterateReportBlockItem();
     400             :   void IterateSDESChunk();
     401             :   void IterateBYEItem();
     402             :   void IterateExtendedJitterItem();
     403             :   void IterateNACKItem();
     404             :   void IterateTMMBRItem();
     405             :   void IterateTMMBNItem();
     406             :   void IterateSLIItem();
     407             :   void IterateRPSIItem();
     408             :   void IterateFIRItem();
     409             :   void IteratePsfbAppItem();
     410             :   void IteratePsfbREMBItem();
     411             :   void IterateAppItem();
     412             :   void IterateXrItem();
     413             :   void IterateXrDlrrItem();
     414             : 
     415             :   void Validate();
     416             :   void EndCurrentBlock();
     417             : 
     418             :   bool ParseRR();
     419             :   bool ParseSR();
     420             :   bool ParseReportBlockItem();
     421             : 
     422             :   bool ParseSDES();
     423             :   bool ParseSDESChunk();
     424             :   bool ParseSDESItem();
     425             : 
     426             :   bool ParseBYE();
     427             :   bool ParseBYEItem();
     428             : 
     429             :   bool ParseIJ();
     430             :   bool ParseIJItem();
     431             : 
     432             :   bool ParseXr();
     433             :   bool ParseXrItem();
     434             :   bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
     435             :   bool ParseXrDlrr(int block_length_4bytes);
     436             :   bool ParseXrDlrrItem();
     437             :   bool ParseXrVoipMetricItem(int block_length_4bytes);
     438             :   bool ParseXrUnsupportedBlockType(int block_length_4bytes);
     439             : 
     440             :   bool ParseFBCommon(const RtcpCommonHeader& header);
     441             :   bool ParseNACKItem();
     442             :   bool ParseTMMBRItem();
     443             :   bool ParseTMMBNItem();
     444             :   bool ParseSLIItem();
     445             :   bool ParseRPSIItem();
     446             :   bool ParseFIRItem();
     447             :   bool ParsePsfbAppItem();
     448             :   bool ParsePsfbREMBItem();
     449             : 
     450             :   bool ParseAPP(const RtcpCommonHeader& header);
     451             :   bool ParseAPPItem();
     452             : 
     453             :  private:
     454             :   const uint8_t* const _ptrRTCPDataBegin;
     455             :   const bool _RTCPReducedSizeEnable;
     456             :   const uint8_t* const _ptrRTCPDataEnd;
     457             : 
     458             :   bool _validPacket;
     459             :   const uint8_t* _ptrRTCPData;
     460             :   const uint8_t* _ptrRTCPBlockEnd;
     461             : 
     462             :   ParseState _state;
     463             :   uint8_t _numberOfBlocks;
     464             :   size_t num_skipped_blocks_;
     465             : 
     466             :   RTCPPacketTypes _packetType;
     467             :   RTCPPacket _packet;
     468             :   std::unique_ptr<webrtc::rtcp::RtcpPacket> rtcp_packet_;
     469             : };
     470             : 
     471             : class RTCPPacketIterator {
     472             :  public:
     473             :   RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength);
     474             :   ~RTCPPacketIterator();
     475             : 
     476             :   const RtcpCommonHeader* Begin();
     477             :   const RtcpCommonHeader* Iterate();
     478             :   const RtcpCommonHeader* Current();
     479             : 
     480             :  private:
     481             :   uint8_t* const _ptrBegin;
     482             :   uint8_t* const _ptrEnd;
     483             : 
     484             :   uint8_t* _ptrBlock;
     485             : 
     486             :   RtcpCommonHeader _header;
     487             : };
     488             : }  // namespace RTCPUtility
     489             : }  // namespace webrtc
     490             : #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_

Generated by: LCOV version 1.13