blob: 804e8b94783791d493184641b62493ea67ca1b86 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000014#include <stddef.h> // size_t, ptrdiff_t
niklase@google.com470e71d2011-07-07 08:21:25 +000015
pbos@webrtc.orga048d7c2013-05-29 14:27:38 +000016#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"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
20namespace webrtc {
21namespace RTCPUtility {
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +000022
23class NackStats {
24 public:
25 NackStats();
26 ~NackStats();
27
28 // Updates stats with requested sequence number.
29 // This function should be called for each NACK request to calculate the
30 // number of unique NACKed RTP packets.
31 void ReportRequest(uint16_t sequence_number);
32
33 // Gets the number of NACKed RTP packets.
34 uint32_t requests() const { return requests_; }
35
36 // Gets the number of unique NACKed RTP packets.
37 uint32_t unique_requests() const { return unique_requests_; }
38
39 private:
40 uint16_t max_sequence_number_;
41 uint32_t requests_;
42 uint32_t unique_requests_;
43};
44
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +000045 uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
46
niklase@google.com470e71d2011-07-07 08:21:25 +000047 // CNAME
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +000048 struct RTCPCnameInformation
niklase@google.com470e71d2011-07-07 08:21:25 +000049 {
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +000050 char name[RTCP_CNAME_SIZE];
niklase@google.com470e71d2011-07-07 08:21:25 +000051 };
niklase@google.com470e71d2011-07-07 08:21:25 +000052 struct RTCPPacketRR
53 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +000054 uint32_t SenderSSRC;
55 uint8_t NumberOfReportBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +000056 };
57 struct RTCPPacketSR
58 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +000059 uint32_t SenderSSRC;
60 uint8_t NumberOfReportBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +000061
62 // sender info
pbos@webrtc.org2f446732013-04-08 11:08:41 +000063 uint32_t NTPMostSignificant;
64 uint32_t NTPLeastSignificant;
65 uint32_t RTPTimestamp;
66 uint32_t SenderPacketCount;
67 uint32_t SenderOctetCount;
niklase@google.com470e71d2011-07-07 08:21:25 +000068 };
69 struct RTCPPacketReportBlockItem
70 {
71 // report block
pbos@webrtc.org2f446732013-04-08 11:08:41 +000072 uint32_t SSRC;
73 uint8_t FractionLost;
74 uint32_t CumulativeNumOfPacketsLost;
75 uint32_t ExtendedHighestSequenceNumber;
76 uint32_t Jitter;
77 uint32_t LastSR;
78 uint32_t DelayLastSR;
niklase@google.com470e71d2011-07-07 08:21:25 +000079 };
niklase@google.com470e71d2011-07-07 08:21:25 +000080 struct RTCPPacketSDESCName
81 {
82 // RFC3550
pbos@webrtc.org2f446732013-04-08 11:08:41 +000083 uint32_t SenderSSRC;
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +000084 char CName[RTCP_CNAME_SIZE];
niklase@google.com470e71d2011-07-07 08:21:25 +000085 };
86
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000087 struct RTCPPacketExtendedJitterReportItem
88 {
89 // RFC 5450
pbos@webrtc.org2f446732013-04-08 11:08:41 +000090 uint32_t Jitter;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000091 };
92
niklase@google.com470e71d2011-07-07 08:21:25 +000093 struct RTCPPacketBYE
94 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +000095 uint32_t SenderSSRC;
niklase@google.com470e71d2011-07-07 08:21:25 +000096 };
97 struct RTCPPacketXR
98 {
99 // RFC 3611
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000100 uint32_t OriginatorSSRC;
niklase@google.com470e71d2011-07-07 08:21:25 +0000101 };
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +0000102 struct RTCPPacketXRReceiverReferenceTimeItem
103 {
104 // RFC 3611 4.4
105 uint32_t NTPMostSignificant;
106 uint32_t NTPLeastSignificant;
107 };
108 struct RTCPPacketXRDLRRReportBlockItem
109 {
110 // RFC 3611 4.5
111 uint32_t SSRC;
112 uint32_t LastRR;
113 uint32_t DelayLastRR;
114 };
niklase@google.com470e71d2011-07-07 08:21:25 +0000115 struct RTCPPacketXRVOIPMetricItem
116 {
117 // RFC 3611 4.7
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000118 uint32_t SSRC;
119 uint8_t lossRate;
120 uint8_t discardRate;
121 uint8_t burstDensity;
122 uint8_t gapDensity;
123 uint16_t burstDuration;
124 uint16_t gapDuration;
125 uint16_t roundTripDelay;
126 uint16_t endSystemDelay;
127 uint8_t signalLevel;
128 uint8_t noiseLevel;
129 uint8_t RERL;
130 uint8_t Gmin;
131 uint8_t Rfactor;
132 uint8_t extRfactor;
133 uint8_t MOSLQ;
134 uint8_t MOSCQ;
135 uint8_t RXconfig;
136 uint16_t JBnominal;
137 uint16_t JBmax;
138 uint16_t JBabsMax;
niklase@google.com470e71d2011-07-07 08:21:25 +0000139 };
140
141 struct RTCPPacketRTPFBNACK
142 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000143 uint32_t SenderSSRC;
144 uint32_t MediaSSRC;
niklase@google.com470e71d2011-07-07 08:21:25 +0000145 };
146 struct RTCPPacketRTPFBNACKItem
147 {
148 // RFC4585
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000149 uint16_t PacketID;
150 uint16_t BitMask;
niklase@google.com470e71d2011-07-07 08:21:25 +0000151 };
152
153 struct RTCPPacketRTPFBTMMBR
154 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000155 uint32_t SenderSSRC;
156 uint32_t MediaSSRC; // zero!
niklase@google.com470e71d2011-07-07 08:21:25 +0000157 };
158 struct RTCPPacketRTPFBTMMBRItem
159 {
160 // RFC5104
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000161 uint32_t SSRC;
162 uint32_t MaxTotalMediaBitRate; // In Kbit/s
163 uint32_t MeasuredOverhead;
niklase@google.com470e71d2011-07-07 08:21:25 +0000164 };
165
166 struct RTCPPacketRTPFBTMMBN
167 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000168 uint32_t SenderSSRC;
169 uint32_t MediaSSRC; // zero!
niklase@google.com470e71d2011-07-07 08:21:25 +0000170 };
171 struct RTCPPacketRTPFBTMMBNItem
172 {
173 // RFC5104
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000174 uint32_t SSRC; // "Owner"
175 uint32_t MaxTotalMediaBitRate;
176 uint32_t MeasuredOverhead;
niklase@google.com470e71d2011-07-07 08:21:25 +0000177 };
178
179 struct RTCPPacketPSFBFIR
180 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000181 uint32_t SenderSSRC;
182 uint32_t MediaSSRC; // zero!
niklase@google.com470e71d2011-07-07 08:21:25 +0000183 };
184 struct RTCPPacketPSFBFIRItem
185 {
186 // RFC5104
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000187 uint32_t SSRC;
188 uint8_t CommandSequenceNumber;
niklase@google.com470e71d2011-07-07 08:21:25 +0000189 };
190
191 struct RTCPPacketPSFBPLI
192 {
193 // RFC4585
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000194 uint32_t SenderSSRC;
195 uint32_t MediaSSRC;
niklase@google.com470e71d2011-07-07 08:21:25 +0000196 };
197
198 struct RTCPPacketPSFBSLI
199 {
200 // RFC4585
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000201 uint32_t SenderSSRC;
202 uint32_t MediaSSRC;
niklase@google.com470e71d2011-07-07 08:21:25 +0000203 };
204 struct RTCPPacketPSFBSLIItem
205 {
206 // RFC4585
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000207 uint16_t FirstMB;
208 uint16_t NumberOfMB;
209 uint8_t PictureId;
niklase@google.com470e71d2011-07-07 08:21:25 +0000210 };
211 struct RTCPPacketPSFBRPSI
212 {
213 // RFC4585
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000214 uint32_t SenderSSRC;
215 uint32_t MediaSSRC;
216 uint8_t PayloadType;
217 uint16_t NumberOfValidBits;
218 uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
niklase@google.com470e71d2011-07-07 08:21:25 +0000219 };
asapersson@webrtc.orga7689702012-04-19 07:01:29 +0000220 struct RTCPPacketPSFBAPP
221 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000222 uint32_t SenderSSRC;
223 uint32_t MediaSSRC;
asapersson@webrtc.orga7689702012-04-19 07:01:29 +0000224 };
225 struct RTCPPacketPSFBREMBItem
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000226 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000227 uint32_t BitRate;
228 uint8_t NumberOfSSRCs;
229 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000230 };
niklase@google.com470e71d2011-07-07 08:21:25 +0000231 // generic name APP
232 struct RTCPPacketAPP
233 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000234 uint8_t SubType;
235 uint32_t Name;
236 uint8_t Data[kRtcpAppCode_DATA_SIZE];
237 uint16_t Size;
niklase@google.com470e71d2011-07-07 08:21:25 +0000238 };
239
240 union RTCPPacket
241 {
242 RTCPPacketRR RR;
243 RTCPPacketSR SR;
244 RTCPPacketReportBlockItem ReportBlockItem;
245
246 RTCPPacketSDESCName CName;
247 RTCPPacketBYE BYE;
248
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000249 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
250
niklase@google.com470e71d2011-07-07 08:21:25 +0000251 RTCPPacketRTPFBNACK NACK;
252 RTCPPacketRTPFBNACKItem NACKItem;
253
254 RTCPPacketPSFBPLI PLI;
255 RTCPPacketPSFBSLI SLI;
256 RTCPPacketPSFBSLIItem SLIItem;
257 RTCPPacketPSFBRPSI RPSI;
asapersson@webrtc.orga7689702012-04-19 07:01:29 +0000258 RTCPPacketPSFBAPP PSFBAPP;
259 RTCPPacketPSFBREMBItem REMBItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000260
261 RTCPPacketRTPFBTMMBR TMMBR;
262 RTCPPacketRTPFBTMMBRItem TMMBRItem;
263 RTCPPacketRTPFBTMMBN TMMBN;
264 RTCPPacketRTPFBTMMBNItem TMMBNItem;
265 RTCPPacketPSFBFIR FIR;
266 RTCPPacketPSFBFIRItem FIRItem;
267
268 RTCPPacketXR XR;
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +0000269 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
270 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000271 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
272
273 RTCPPacketAPP APP;
274 };
275
276 enum RTCPPacketTypes
277 {
278 kRtcpNotValidCode,
279
280 // RFC3550
281 kRtcpRrCode,
282 kRtcpSrCode,
283 kRtcpReportBlockItemCode,
284
285 kRtcpSdesCode,
286 kRtcpSdesChunkCode,
287 kRtcpByeCode,
288
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000289 // RFC5450
290 kRtcpExtendedIjCode,
291 kRtcpExtendedIjItemCode,
292
niklase@google.com470e71d2011-07-07 08:21:25 +0000293 // RFC4585
294 kRtcpRtpfbNackCode,
295 kRtcpRtpfbNackItemCode,
296
297 kRtcpPsfbPliCode,
298 kRtcpPsfbRpsiCode,
299 kRtcpPsfbSliCode,
300 kRtcpPsfbSliItemCode,
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000301 kRtcpPsfbAppCode,
asapersson@webrtc.orga7689702012-04-19 07:01:29 +0000302 kRtcpPsfbRembCode,
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000303 kRtcpPsfbRembItemCode,
niklase@google.com470e71d2011-07-07 08:21:25 +0000304
305 // RFC5104
306 kRtcpRtpfbTmmbrCode,
307 kRtcpRtpfbTmmbrItemCode,
308 kRtcpRtpfbTmmbnCode,
309 kRtcpRtpfbTmmbnItemCode,
310 kRtcpPsfbFirCode,
311 kRtcpPsfbFirItemCode,
312
313 // draft-perkins-avt-rapid-rtp-sync
314 kRtcpRtpfbSrReqCode,
315
316 // RFC 3611
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +0000317 kRtcpXrHeaderCode,
318 kRtcpXrReceiverReferenceTimeCode,
319 kRtcpXrDlrrReportBlockCode,
320 kRtcpXrDlrrReportBlockItemCode,
niklase@google.com470e71d2011-07-07 08:21:25 +0000321 kRtcpXrVoipMetricCode,
322
323 kRtcpAppCode,
324 kRtcpAppItemCode,
325 };
326
327 struct RTCPRawPacket
328 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000329 const uint8_t* _ptrPacketBegin;
330 const uint8_t* _ptrPacketEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000331 };
332
333 struct RTCPModRawPacket
334 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000335 uint8_t* _ptrPacketBegin;
336 uint8_t* _ptrPacketEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000337 };
338
339 struct RTCPCommonHeader
340 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000341 uint8_t V; // Version
niklase@google.com470e71d2011-07-07 08:21:25 +0000342 bool P; // Padding
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000343 uint8_t IC; // Item count/subtype
344 uint8_t PT; // Packet Type
345 uint16_t LengthInOctets;
niklase@google.com470e71d2011-07-07 08:21:25 +0000346 };
347
348 enum RTCPPT
349 {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000350 PT_IJ = 195,
niklase@google.com470e71d2011-07-07 08:21:25 +0000351 PT_SR = 200,
352 PT_RR = 201,
353 PT_SDES = 202,
354 PT_BYE = 203,
355 PT_APP = 204,
356 PT_RTPFB = 205,
357 PT_PSFB = 206,
358 PT_XR = 207
359 };
360
asapersson@webrtc.org38599512013-11-12 08:08:26 +0000361 // Extended report blocks, RFC 3611.
362 enum RtcpXrBlockType {
363 kBtReceiverReferenceTime = 4,
364 kBtDlrr = 5,
365 kBtVoipMetric = 7
366 };
367
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000368 bool RTCPParseCommonHeader( const uint8_t* ptrDataBegin,
369 const uint8_t* ptrDataEnd,
niklase@google.com470e71d2011-07-07 08:21:25 +0000370 RTCPCommonHeader& parsedHeader);
371
372 class RTCPParserV2
373 {
374 public:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000375 RTCPParserV2(const uint8_t* rtcpData,
niklase@google.com470e71d2011-07-07 08:21:25 +0000376 size_t rtcpDataLength,
377 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
378 ~RTCPParserV2();
379
380 RTCPPacketTypes PacketType() const;
381 const RTCPPacket& Packet() const;
382 const RTCPRawPacket& RawPacket() const;
383 ptrdiff_t LengthLeft() const;
384
385 bool IsValid() const;
386
387 RTCPPacketTypes Begin();
388 RTCPPacketTypes Iterate();
389
390 private:
391 enum ParseState
392 {
393 State_TopLevel, // Top level packet
394 State_ReportBlockItem, // SR/RR report block
395 State_SDESChunk, // SDES chunk
396 State_BYEItem, // BYE item
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000397 State_ExtendedJitterItem, // Extended jitter report item
niklase@google.com470e71d2011-07-07 08:21:25 +0000398 State_RTPFB_NACKItem, // NACK FCI item
399 State_RTPFB_TMMBRItem, // TMMBR FCI item
400 State_RTPFB_TMMBNItem, // TMMBN FCI item
401 State_PSFB_SLIItem, // SLI FCI item
402 State_PSFB_RPSIItem, // RPSI FCI item
403 State_PSFB_FIRItem, // FIR FCI item
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000404 State_PSFB_AppItem, // Application specific FCI item
405 State_PSFB_REMBItem, // Application specific REMB item
niklase@google.com470e71d2011-07-07 08:21:25 +0000406 State_XRItem,
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +0000407 State_XR_DLLRItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000408 State_AppItem
409 };
410
411 private:
412 void IterateTopLevel();
413 void IterateReportBlockItem();
414 void IterateSDESChunk();
415 void IterateBYEItem();
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000416 void IterateExtendedJitterItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000417 void IterateNACKItem();
418 void IterateTMMBRItem();
419 void IterateTMMBNItem();
420 void IterateSLIItem();
421 void IterateRPSIItem();
422 void IterateFIRItem();
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000423 void IteratePsfbAppItem();
424 void IteratePsfbREMBItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000425 void IterateAppItem();
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +0000426 void IterateXrItem();
427 void IterateXrDlrrItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000428
429 void Validate();
430 void EndCurrentBlock();
431
432 bool ParseRR();
433 bool ParseSR();
434 bool ParseReportBlockItem();
435
436 bool ParseSDES();
437 bool ParseSDESChunk();
438 bool ParseSDESItem();
439
440 bool ParseBYE();
441 bool ParseBYEItem();
442
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000443 bool ParseIJ();
444 bool ParseIJItem();
445
asapersson@webrtc.org38599512013-11-12 08:08:26 +0000446 bool ParseXr();
447 bool ParseXrItem();
448 bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
449 bool ParseXrDlrr(int block_length_4bytes);
450 bool ParseXrDlrrItem();
451 bool ParseXrVoipMetricItem(int block_length_4bytes);
452 bool ParseXrUnsupportedBlockType(int block_length_4bytes);
niklase@google.com470e71d2011-07-07 08:21:25 +0000453
454 bool ParseFBCommon(const RTCPCommonHeader& header);
455 bool ParseNACKItem();
456 bool ParseTMMBRItem();
457 bool ParseTMMBNItem();
458 bool ParseSLIItem();
459 bool ParseRPSIItem();
460 bool ParseFIRItem();
pwestin@webrtc.org741da942011-09-20 13:52:04 +0000461 bool ParsePsfbAppItem();
462 bool ParsePsfbREMBItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000463
464 bool ParseAPP(const RTCPCommonHeader& header);
465 bool ParseAPPItem();
466
467 private:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000468 const uint8_t* const _ptrRTCPDataBegin;
niklase@google.com470e71d2011-07-07 08:21:25 +0000469 const bool _RTCPReducedSizeEnable;
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000470 const uint8_t* const _ptrRTCPDataEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000471
472 bool _validPacket;
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000473 const uint8_t* _ptrRTCPData;
474 const uint8_t* _ptrRTCPBlockEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000475
476 ParseState _state;
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000477 uint8_t _numberOfBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +0000478
479 RTCPPacketTypes _packetType;
480 RTCPPacket _packet;
481 };
482
483 class RTCPPacketIterator
484 {
485 public:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000486 RTCPPacketIterator(uint8_t* rtcpData,
niklase@google.com470e71d2011-07-07 08:21:25 +0000487 size_t rtcpDataLength);
488 ~RTCPPacketIterator();
489
490 const RTCPCommonHeader* Begin();
491 const RTCPCommonHeader* Iterate();
492 const RTCPCommonHeader* Current();
493
494 private:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000495 uint8_t* const _ptrBegin;
496 uint8_t* const _ptrEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000497
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000498 uint8_t* _ptrBlock;
niklase@google.com470e71d2011-07-07 08:21:25 +0000499
500 RTCPCommonHeader _header;
501 };
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000502} // RTCPUtility
503} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000504#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_