• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
17 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
18 #include "webrtc/typedefs.h"
19 
20 namespace webrtc {
21 namespace RTCPUtility {
22     uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
23 
24     // CNAME
25     struct RTCPCnameInformation
26     {
27         char name[RTCP_CNAME_SIZE];
28     };
29     struct RTCPPacketRR
30     {
31         uint32_t SenderSSRC;
32         uint8_t  NumberOfReportBlocks;
33     };
34     struct RTCPPacketSR
35     {
36         uint32_t SenderSSRC;
37         uint8_t  NumberOfReportBlocks;
38 
39         // sender info
40         uint32_t NTPMostSignificant;
41         uint32_t NTPLeastSignificant;
42         uint32_t RTPTimestamp;
43         uint32_t SenderPacketCount;
44         uint32_t SenderOctetCount;
45     };
46     struct RTCPPacketReportBlockItem
47     {
48         // report block
49         uint32_t SSRC;
50         uint8_t  FractionLost;
51         uint32_t CumulativeNumOfPacketsLost;
52         uint32_t ExtendedHighestSequenceNumber;
53         uint32_t Jitter;
54         uint32_t LastSR;
55         uint32_t DelayLastSR;
56     };
57     struct RTCPPacketSDESCName
58     {
59         // RFC3550
60         uint32_t SenderSSRC;
61         char CName[RTCP_CNAME_SIZE];
62     };
63 
64     struct RTCPPacketExtendedJitterReportItem
65     {
66         // RFC 5450
67         uint32_t Jitter;
68     };
69 
70     struct RTCPPacketBYE
71     {
72         uint32_t SenderSSRC;
73     };
74     struct RTCPPacketXR
75     {
76         // RFC 3611
77         uint32_t OriginatorSSRC;
78     };
79     struct RTCPPacketXRReceiverReferenceTimeItem
80     {
81         // RFC 3611 4.4
82         uint32_t NTPMostSignificant;
83         uint32_t NTPLeastSignificant;
84     };
85     struct RTCPPacketXRDLRRReportBlockItem
86     {
87         // RFC 3611 4.5
88         uint32_t SSRC;
89         uint32_t LastRR;
90         uint32_t DelayLastRR;
91     };
92     struct RTCPPacketXRVOIPMetricItem
93     {
94         // RFC 3611 4.7
95         uint32_t    SSRC;
96         uint8_t     lossRate;
97         uint8_t     discardRate;
98         uint8_t     burstDensity;
99         uint8_t     gapDensity;
100         uint16_t    burstDuration;
101         uint16_t    gapDuration;
102         uint16_t    roundTripDelay;
103         uint16_t    endSystemDelay;
104         uint8_t     signalLevel;
105         uint8_t     noiseLevel;
106         uint8_t     RERL;
107         uint8_t     Gmin;
108         uint8_t     Rfactor;
109         uint8_t     extRfactor;
110         uint8_t     MOSLQ;
111         uint8_t     MOSCQ;
112         uint8_t     RXconfig;
113         uint16_t    JBnominal;
114         uint16_t    JBmax;
115         uint16_t    JBabsMax;
116     };
117 
118     struct RTCPPacketRTPFBNACK
119     {
120         uint32_t SenderSSRC;
121         uint32_t MediaSSRC;
122     };
123     struct RTCPPacketRTPFBNACKItem
124     {
125         // RFC4585
126         uint16_t PacketID;
127         uint16_t BitMask;
128     };
129 
130     struct RTCPPacketRTPFBTMMBR
131     {
132         uint32_t SenderSSRC;
133         uint32_t MediaSSRC; // zero!
134     };
135     struct RTCPPacketRTPFBTMMBRItem
136     {
137         // RFC5104
138         uint32_t SSRC;
139         uint32_t MaxTotalMediaBitRate; // In Kbit/s
140         uint32_t MeasuredOverhead;
141     };
142 
143     struct RTCPPacketRTPFBTMMBN
144     {
145         uint32_t SenderSSRC;
146         uint32_t MediaSSRC; // zero!
147     };
148     struct RTCPPacketRTPFBTMMBNItem
149     {
150         // RFC5104
151         uint32_t SSRC; // "Owner"
152         uint32_t MaxTotalMediaBitRate;
153         uint32_t MeasuredOverhead;
154     };
155 
156     struct RTCPPacketPSFBFIR
157     {
158         uint32_t SenderSSRC;
159         uint32_t MediaSSRC; // zero!
160     };
161     struct RTCPPacketPSFBFIRItem
162     {
163         // RFC5104
164         uint32_t SSRC;
165         uint8_t  CommandSequenceNumber;
166     };
167 
168     struct RTCPPacketPSFBPLI
169     {
170         // RFC4585
171         uint32_t SenderSSRC;
172         uint32_t MediaSSRC;
173     };
174 
175     struct RTCPPacketPSFBSLI
176     {
177         // RFC4585
178         uint32_t SenderSSRC;
179         uint32_t MediaSSRC;
180     };
181     struct RTCPPacketPSFBSLIItem
182     {
183         // RFC4585
184         uint16_t FirstMB;
185         uint16_t NumberOfMB;
186         uint8_t PictureId;
187     };
188     struct RTCPPacketPSFBRPSI
189     {
190         // RFC4585
191         uint32_t SenderSSRC;
192         uint32_t MediaSSRC;
193         uint8_t  PayloadType;
194         uint16_t NumberOfValidBits;
195         uint8_t  NativeBitString[RTCP_RPSI_DATA_SIZE];
196     };
197     struct RTCPPacketPSFBAPP
198     {
199         uint32_t SenderSSRC;
200         uint32_t MediaSSRC;
201     };
202     struct RTCPPacketPSFBREMBItem
203     {
204         uint32_t BitRate;
205         uint8_t NumberOfSSRCs;
206         uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
207     };
208     // generic name APP
209     struct RTCPPacketAPP
210     {
211         uint8_t     SubType;
212         uint32_t    Name;
213         uint8_t     Data[kRtcpAppCode_DATA_SIZE];
214         uint16_t    Size;
215     };
216 
217     union RTCPPacket
218     {
219         RTCPPacketRR              RR;
220         RTCPPacketSR              SR;
221         RTCPPacketReportBlockItem ReportBlockItem;
222 
223         RTCPPacketSDESCName       CName;
224         RTCPPacketBYE             BYE;
225 
226         RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
227 
228         RTCPPacketRTPFBNACK       NACK;
229         RTCPPacketRTPFBNACKItem   NACKItem;
230 
231         RTCPPacketPSFBPLI         PLI;
232         RTCPPacketPSFBSLI         SLI;
233         RTCPPacketPSFBSLIItem     SLIItem;
234         RTCPPacketPSFBRPSI        RPSI;
235         RTCPPacketPSFBAPP         PSFBAPP;
236         RTCPPacketPSFBREMBItem    REMBItem;
237 
238         RTCPPacketRTPFBTMMBR      TMMBR;
239         RTCPPacketRTPFBTMMBRItem  TMMBRItem;
240         RTCPPacketRTPFBTMMBN      TMMBN;
241         RTCPPacketRTPFBTMMBNItem  TMMBNItem;
242         RTCPPacketPSFBFIR         FIR;
243         RTCPPacketPSFBFIRItem     FIRItem;
244 
245         RTCPPacketXR               XR;
246         RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
247         RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
248         RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
249 
250         RTCPPacketAPP             APP;
251     };
252 
253     enum RTCPPacketTypes
254     {
255         kRtcpNotValidCode,
256 
257         // RFC3550
258         kRtcpRrCode,
259         kRtcpSrCode,
260         kRtcpReportBlockItemCode,
261 
262         kRtcpSdesCode,
263         kRtcpSdesChunkCode,
264         kRtcpByeCode,
265 
266         // RFC5450
267         kRtcpExtendedIjCode,
268         kRtcpExtendedIjItemCode,
269 
270         // RFC4585
271         kRtcpRtpfbNackCode,
272         kRtcpRtpfbNackItemCode,
273 
274         kRtcpPsfbPliCode,
275         kRtcpPsfbRpsiCode,
276         kRtcpPsfbSliCode,
277         kRtcpPsfbSliItemCode,
278         kRtcpPsfbAppCode,
279         kRtcpPsfbRembCode,
280         kRtcpPsfbRembItemCode,
281 
282         // RFC5104
283         kRtcpRtpfbTmmbrCode,
284         kRtcpRtpfbTmmbrItemCode,
285         kRtcpRtpfbTmmbnCode,
286         kRtcpRtpfbTmmbnItemCode,
287         kRtcpPsfbFirCode,
288         kRtcpPsfbFirItemCode,
289 
290         // draft-perkins-avt-rapid-rtp-sync
291         kRtcpRtpfbSrReqCode,
292 
293         // RFC 3611
294         kRtcpXrHeaderCode,
295         kRtcpXrReceiverReferenceTimeCode,
296         kRtcpXrDlrrReportBlockCode,
297         kRtcpXrDlrrReportBlockItemCode,
298         kRtcpXrVoipMetricCode,
299 
300         kRtcpAppCode,
301         kRtcpAppItemCode,
302     };
303 
304     struct RTCPRawPacket
305     {
306         const uint8_t* _ptrPacketBegin;
307         const uint8_t* _ptrPacketEnd;
308     };
309 
310     struct RTCPModRawPacket
311     {
312         uint8_t* _ptrPacketBegin;
313         uint8_t* _ptrPacketEnd;
314     };
315 
316     struct RTCPCommonHeader
317     {
318         uint8_t  V;  // Version
319         bool           P;  // Padding
320         uint8_t  IC; // Item count/subtype
321         uint8_t  PT; // Packet Type
322         uint16_t LengthInOctets;
323     };
324 
325     enum RTCPPT
326     {
327         PT_IJ    = 195,
328         PT_SR    = 200,
329         PT_RR    = 201,
330         PT_SDES  = 202,
331         PT_BYE   = 203,
332         PT_APP   = 204,
333         PT_RTPFB = 205,
334         PT_PSFB  = 206,
335         PT_XR    = 207
336     };
337 
338     // Extended report blocks, RFC 3611.
339     enum RtcpXrBlockType {
340       kBtReceiverReferenceTime = 4,
341       kBtDlrr = 5,
342       kBtVoipMetric = 7
343     };
344 
345     bool RTCPParseCommonHeader( const uint8_t* ptrDataBegin,
346                                 const uint8_t* ptrDataEnd,
347                                 RTCPCommonHeader& parsedHeader);
348 
349     class RTCPParserV2
350     {
351     public:
352         RTCPParserV2(const uint8_t* rtcpData,
353                      size_t rtcpDataLength,
354                      bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
355         ~RTCPParserV2();
356 
357         RTCPPacketTypes PacketType() const;
358         const RTCPPacket& Packet() const;
359         const RTCPRawPacket& RawPacket() const;
360         ptrdiff_t LengthLeft() const;
361 
362         bool IsValid() const;
363 
364         RTCPPacketTypes Begin();
365         RTCPPacketTypes Iterate();
366 
367     private:
368         enum ParseState
369         {
370             State_TopLevel,        // Top level packet
371             State_ReportBlockItem, // SR/RR report block
372             State_SDESChunk,       // SDES chunk
373             State_BYEItem,         // BYE item
374             State_ExtendedJitterItem, // Extended jitter report item
375             State_RTPFB_NACKItem,  // NACK FCI item
376             State_RTPFB_TMMBRItem, // TMMBR FCI item
377             State_RTPFB_TMMBNItem, // TMMBN FCI item
378             State_PSFB_SLIItem,    // SLI FCI item
379             State_PSFB_RPSIItem,   // RPSI FCI item
380             State_PSFB_FIRItem,    // FIR FCI item
381             State_PSFB_AppItem,    // Application specific FCI item
382             State_PSFB_REMBItem,   // Application specific REMB item
383             State_XRItem,
384             State_XR_DLLRItem,
385             State_AppItem
386         };
387 
388     private:
389         void IterateTopLevel();
390         void IterateReportBlockItem();
391         void IterateSDESChunk();
392         void IterateBYEItem();
393         void IterateExtendedJitterItem();
394         void IterateNACKItem();
395         void IterateTMMBRItem();
396         void IterateTMMBNItem();
397         void IterateSLIItem();
398         void IterateRPSIItem();
399         void IterateFIRItem();
400         void IteratePsfbAppItem();
401         void IteratePsfbREMBItem();
402         void IterateAppItem();
403         void IterateXrItem();
404         void IterateXrDlrrItem();
405 
406         void Validate();
407         void EndCurrentBlock();
408 
409         bool ParseRR();
410         bool ParseSR();
411         bool ParseReportBlockItem();
412 
413         bool ParseSDES();
414         bool ParseSDESChunk();
415         bool ParseSDESItem();
416 
417         bool ParseBYE();
418         bool ParseBYEItem();
419 
420         bool ParseIJ();
421         bool ParseIJItem();
422 
423         bool ParseXr();
424         bool ParseXrItem();
425         bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
426         bool ParseXrDlrr(int block_length_4bytes);
427         bool ParseXrDlrrItem();
428         bool ParseXrVoipMetricItem(int block_length_4bytes);
429         bool ParseXrUnsupportedBlockType(int block_length_4bytes);
430 
431         bool ParseFBCommon(const RTCPCommonHeader& header);
432         bool ParseNACKItem();
433         bool ParseTMMBRItem();
434         bool ParseTMMBNItem();
435         bool ParseSLIItem();
436         bool ParseRPSIItem();
437         bool ParseFIRItem();
438         bool ParsePsfbAppItem();
439         bool ParsePsfbREMBItem();
440 
441         bool ParseAPP(const RTCPCommonHeader& header);
442         bool ParseAPPItem();
443 
444     private:
445         const uint8_t* const _ptrRTCPDataBegin;
446         const bool                 _RTCPReducedSizeEnable;
447         const uint8_t* const _ptrRTCPDataEnd;
448 
449         bool                     _validPacket;
450         const uint8_t*     _ptrRTCPData;
451         const uint8_t*     _ptrRTCPBlockEnd;
452 
453         ParseState               _state;
454         uint8_t            _numberOfBlocks;
455 
456         RTCPPacketTypes          _packetType;
457         RTCPPacket               _packet;
458     };
459 
460     class RTCPPacketIterator
461     {
462     public:
463         RTCPPacketIterator(uint8_t* rtcpData,
464                             size_t rtcpDataLength);
465         ~RTCPPacketIterator();
466 
467         const RTCPCommonHeader* Begin();
468         const RTCPCommonHeader* Iterate();
469         const RTCPCommonHeader* Current();
470 
471     private:
472         uint8_t* const     _ptrBegin;
473         uint8_t* const     _ptrEnd;
474 
475         uint8_t*           _ptrBlock;
476 
477         RTCPCommonHeader         _header;
478     };
479 }  // RTCPUtility
480 }  // namespace webrtc
481 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_
482