blob: fedd1dc3873e993ecef37dc3db5b494ccede8ef1 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
Erik Språng242e22b2015-05-11 10:17:43 +02002* 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*/
niklase@google.com470e71d2011-07-07 08:21:25 +000010
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
kwiberg84be5112016-04-27 01:19:58 -070016#include <memory>
17
terelius52d4e6b2016-04-26 09:31:59 -070018#include "webrtc/base/scoped_ptr.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010019#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
pbos@webrtc.orga048d7c2013-05-29 14:27:38 +000020#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
21#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000022
23namespace webrtc {
Erik Språng6b8d3552015-09-24 15:06:57 +020024namespace rtcp {
25class RtcpPacket;
26}
niklase@google.com470e71d2011-07-07 08:21:25 +000027namespace RTCPUtility {
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +000028
29class NackStats {
30 public:
31 NackStats();
32 ~NackStats();
33
34 // Updates stats with requested sequence number.
35 // This function should be called for each NACK request to calculate the
36 // number of unique NACKed RTP packets.
37 void ReportRequest(uint16_t sequence_number);
38
39 // Gets the number of NACKed RTP packets.
40 uint32_t requests() const { return requests_; }
41
42 // Gets the number of unique NACKed RTP packets.
43 uint32_t unique_requests() const { return unique_requests_; }
44
45 private:
46 uint16_t max_sequence_number_;
47 uint32_t requests_;
48 uint32_t unique_requests_;
49};
50
Erik Språng242e22b2015-05-11 10:17:43 +020051uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +000052
Erik Språng242e22b2015-05-11 10:17:43 +020053// CNAME
54struct RTCPCnameInformation {
55 char name[RTCP_CNAME_SIZE];
56};
57struct RTCPPacketRR {
58 uint32_t SenderSSRC;
59 uint8_t NumberOfReportBlocks;
60};
61struct RTCPPacketSR {
62 uint32_t SenderSSRC;
63 uint8_t NumberOfReportBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +000064
Erik Språng242e22b2015-05-11 10:17:43 +020065 // sender info
66 uint32_t NTPMostSignificant;
67 uint32_t NTPLeastSignificant;
68 uint32_t RTPTimestamp;
69 uint32_t SenderPacketCount;
70 uint32_t SenderOctetCount;
71};
72struct RTCPPacketReportBlockItem {
73 // report block
74 uint32_t SSRC;
75 uint8_t FractionLost;
76 uint32_t CumulativeNumOfPacketsLost;
77 uint32_t ExtendedHighestSequenceNumber;
78 uint32_t Jitter;
79 uint32_t LastSR;
80 uint32_t DelayLastSR;
81};
82struct RTCPPacketSDESCName {
83 // RFC3550
84 uint32_t SenderSSRC;
85 char CName[RTCP_CNAME_SIZE];
86};
niklase@google.com470e71d2011-07-07 08:21:25 +000087
Erik Språng242e22b2015-05-11 10:17:43 +020088struct RTCPPacketExtendedJitterReportItem {
89 // RFC 5450
90 uint32_t Jitter;
91};
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000092
Erik Språng242e22b2015-05-11 10:17:43 +020093struct RTCPPacketBYE {
94 uint32_t SenderSSRC;
95};
96struct RTCPPacketXR {
97 // RFC 3611
98 uint32_t OriginatorSSRC;
99};
100struct RTCPPacketXRReceiverReferenceTimeItem {
101 // RFC 3611 4.4
102 uint32_t NTPMostSignificant;
103 uint32_t NTPLeastSignificant;
104};
105struct RTCPPacketXRDLRRReportBlockItem {
106 // RFC 3611 4.5
107 uint32_t SSRC;
108 uint32_t LastRR;
109 uint32_t DelayLastRR;
110};
111struct RTCPPacketXRVOIPMetricItem {
112 // RFC 3611 4.7
113 uint32_t SSRC;
114 uint8_t lossRate;
115 uint8_t discardRate;
116 uint8_t burstDensity;
117 uint8_t gapDensity;
118 uint16_t burstDuration;
119 uint16_t gapDuration;
120 uint16_t roundTripDelay;
121 uint16_t endSystemDelay;
122 uint8_t signalLevel;
123 uint8_t noiseLevel;
124 uint8_t RERL;
125 uint8_t Gmin;
126 uint8_t Rfactor;
127 uint8_t extRfactor;
128 uint8_t MOSLQ;
129 uint8_t MOSCQ;
130 uint8_t RXconfig;
131 uint16_t JBnominal;
132 uint16_t JBmax;
133 uint16_t JBabsMax;
134};
niklase@google.com470e71d2011-07-07 08:21:25 +0000135
Erik Språng242e22b2015-05-11 10:17:43 +0200136struct RTCPPacketRTPFBNACK {
137 uint32_t SenderSSRC;
138 uint32_t MediaSSRC;
139};
140struct RTCPPacketRTPFBNACKItem {
141 // RFC4585
142 uint16_t PacketID;
143 uint16_t BitMask;
144};
niklase@google.com470e71d2011-07-07 08:21:25 +0000145
Erik Språng242e22b2015-05-11 10:17:43 +0200146struct RTCPPacketRTPFBTMMBR {
147 uint32_t SenderSSRC;
148 uint32_t MediaSSRC; // zero!
149};
150struct RTCPPacketRTPFBTMMBRItem {
151 // RFC5104
152 uint32_t SSRC;
153 uint32_t MaxTotalMediaBitRate; // In Kbit/s
154 uint32_t MeasuredOverhead;
155};
niklase@google.com470e71d2011-07-07 08:21:25 +0000156
Erik Språng242e22b2015-05-11 10:17:43 +0200157struct RTCPPacketRTPFBTMMBN {
158 uint32_t SenderSSRC;
159 uint32_t MediaSSRC; // zero!
160};
161struct RTCPPacketRTPFBTMMBNItem {
162 // RFC5104
163 uint32_t SSRC; // "Owner"
164 uint32_t MaxTotalMediaBitRate;
165 uint32_t MeasuredOverhead;
166};
niklase@google.com470e71d2011-07-07 08:21:25 +0000167
Erik Språng242e22b2015-05-11 10:17:43 +0200168struct RTCPPacketPSFBFIR {
169 uint32_t SenderSSRC;
170 uint32_t MediaSSRC; // zero!
171};
172struct RTCPPacketPSFBFIRItem {
173 // RFC5104
174 uint32_t SSRC;
175 uint8_t CommandSequenceNumber;
176};
niklase@google.com470e71d2011-07-07 08:21:25 +0000177
Erik Språng242e22b2015-05-11 10:17:43 +0200178struct RTCPPacketPSFBPLI {
179 // RFC4585
180 uint32_t SenderSSRC;
181 uint32_t MediaSSRC;
182};
niklase@google.com470e71d2011-07-07 08:21:25 +0000183
Erik Språng242e22b2015-05-11 10:17:43 +0200184struct RTCPPacketPSFBSLI {
185 // RFC4585
186 uint32_t SenderSSRC;
187 uint32_t MediaSSRC;
188};
189struct RTCPPacketPSFBSLIItem {
190 // RFC4585
191 uint16_t FirstMB;
192 uint16_t NumberOfMB;
193 uint8_t PictureId;
194};
195struct RTCPPacketPSFBRPSI {
196 // RFC4585
197 uint32_t SenderSSRC;
198 uint32_t MediaSSRC;
199 uint8_t PayloadType;
200 uint16_t NumberOfValidBits;
201 uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
202};
203struct RTCPPacketPSFBAPP {
204 uint32_t SenderSSRC;
205 uint32_t MediaSSRC;
206};
207struct RTCPPacketPSFBREMBItem {
208 uint32_t BitRate;
209 uint8_t NumberOfSSRCs;
210 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
211};
212// generic name APP
213struct RTCPPacketAPP {
214 uint8_t SubType;
215 uint32_t Name;
216 uint8_t Data[kRtcpAppCode_DATA_SIZE];
217 uint16_t Size;
218};
niklase@google.com470e71d2011-07-07 08:21:25 +0000219
Erik Språng242e22b2015-05-11 10:17:43 +0200220union RTCPPacket {
221 RTCPPacketRR RR;
222 RTCPPacketSR SR;
223 RTCPPacketReportBlockItem ReportBlockItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000224
Erik Språng242e22b2015-05-11 10:17:43 +0200225 RTCPPacketSDESCName CName;
226 RTCPPacketBYE BYE;
niklase@google.com470e71d2011-07-07 08:21:25 +0000227
Erik Språng242e22b2015-05-11 10:17:43 +0200228 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000229
Erik Språng242e22b2015-05-11 10:17:43 +0200230 RTCPPacketRTPFBNACK NACK;
231 RTCPPacketRTPFBNACKItem NACKItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000232
Erik Språng242e22b2015-05-11 10:17:43 +0200233 RTCPPacketPSFBPLI PLI;
234 RTCPPacketPSFBSLI SLI;
235 RTCPPacketPSFBSLIItem SLIItem;
236 RTCPPacketPSFBRPSI RPSI;
237 RTCPPacketPSFBAPP PSFBAPP;
238 RTCPPacketPSFBREMBItem REMBItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000239
Erik Språng242e22b2015-05-11 10:17:43 +0200240 RTCPPacketRTPFBTMMBR TMMBR;
241 RTCPPacketRTPFBTMMBRItem TMMBRItem;
242 RTCPPacketRTPFBTMMBN TMMBN;
243 RTCPPacketRTPFBTMMBNItem TMMBNItem;
244 RTCPPacketPSFBFIR FIR;
245 RTCPPacketPSFBFIRItem FIRItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000246
Erik Språng242e22b2015-05-11 10:17:43 +0200247 RTCPPacketXR XR;
248 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
249 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
250 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000251
Erik Språng242e22b2015-05-11 10:17:43 +0200252 RTCPPacketAPP APP;
253};
niklase@google.com470e71d2011-07-07 08:21:25 +0000254
Erik Språng242e22b2015-05-11 10:17:43 +0200255enum class RTCPPacketTypes {
256 kInvalid,
niklase@google.com470e71d2011-07-07 08:21:25 +0000257
Erik Språng242e22b2015-05-11 10:17:43 +0200258 // RFC3550
259 kRr,
260 kSr,
261 kReportBlockItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000262
Erik Språng242e22b2015-05-11 10:17:43 +0200263 kSdes,
264 kSdesChunk,
265 kBye,
niklase@google.com470e71d2011-07-07 08:21:25 +0000266
Erik Språng242e22b2015-05-11 10:17:43 +0200267 // RFC5450
268 kExtendedIj,
269 kExtendedIjItem,
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000270
Erik Språng242e22b2015-05-11 10:17:43 +0200271 // RFC4585
272 kRtpfbNack,
273 kRtpfbNackItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000274
Erik Språng242e22b2015-05-11 10:17:43 +0200275 kPsfbPli,
276 kPsfbRpsi,
danilchap90a13512016-04-11 10:05:02 -0700277 kPsfbRpsiItem,
Erik Språng242e22b2015-05-11 10:17:43 +0200278 kPsfbSli,
279 kPsfbSliItem,
280 kPsfbApp,
281 kPsfbRemb,
282 kPsfbRembItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000283
Erik Språng242e22b2015-05-11 10:17:43 +0200284 // RFC5104
285 kRtpfbTmmbr,
286 kRtpfbTmmbrItem,
287 kRtpfbTmmbn,
288 kRtpfbTmmbnItem,
289 kPsfbFir,
290 kPsfbFirItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000291
Erik Språng242e22b2015-05-11 10:17:43 +0200292 // draft-perkins-avt-rapid-rtp-sync
293 kRtpfbSrReq,
niklase@google.com470e71d2011-07-07 08:21:25 +0000294
Erik Språng242e22b2015-05-11 10:17:43 +0200295 // RFC 3611
296 kXrHeader,
297 kXrReceiverReferenceTime,
298 kXrDlrrReportBlock,
299 kXrDlrrReportBlockItem,
300 kXrVoipMetric,
niklase@google.com470e71d2011-07-07 08:21:25 +0000301
Erik Språng242e22b2015-05-11 10:17:43 +0200302 kApp,
303 kAppItem,
Erik Språng6b8d3552015-09-24 15:06:57 +0200304
305 // draft-holmer-rmcat-transport-wide-cc-extensions
306 kTransportFeedback,
Erik Språng242e22b2015-05-11 10:17:43 +0200307};
niklase@google.com470e71d2011-07-07 08:21:25 +0000308
Erik Språng242e22b2015-05-11 10:17:43 +0200309struct RTCPRawPacket {
310 const uint8_t* _ptrPacketBegin;
311 const uint8_t* _ptrPacketEnd;
312};
niklase@google.com470e71d2011-07-07 08:21:25 +0000313
Erik Språng242e22b2015-05-11 10:17:43 +0200314struct RTCPModRawPacket {
315 uint8_t* _ptrPacketBegin;
316 uint8_t* _ptrPacketEnd;
317};
niklase@google.com470e71d2011-07-07 08:21:25 +0000318
sprang73a93e82015-09-14 12:50:39 -0700319struct RtcpCommonHeader {
320 static const uint8_t kHeaderSizeBytes = 4;
321 RtcpCommonHeader()
322 : version(2),
323 count_or_format(0),
324 packet_type(0),
325 payload_size_bytes(0),
326 padding_bytes(0) {}
327
328 uint32_t BlockSize() const {
329 return kHeaderSizeBytes + payload_size_bytes + padding_bytes;
330 }
331
332 uint8_t version;
333 uint8_t count_or_format;
334 uint8_t packet_type;
335 uint32_t payload_size_bytes;
336 uint8_t padding_bytes;
Erik Språng242e22b2015-05-11 10:17:43 +0200337};
niklase@google.com470e71d2011-07-07 08:21:25 +0000338
Erik Språng242e22b2015-05-11 10:17:43 +0200339enum RTCPPT : uint8_t {
340 PT_IJ = 195,
341 PT_SR = 200,
342 PT_RR = 201,
343 PT_SDES = 202,
344 PT_BYE = 203,
345 PT_APP = 204,
346 PT_RTPFB = 205,
347 PT_PSFB = 206,
348 PT_XR = 207
349};
niklase@google.com470e71d2011-07-07 08:21:25 +0000350
Erik Språng242e22b2015-05-11 10:17:43 +0200351// Extended report blocks, RFC 3611.
352enum RtcpXrBlockType : uint8_t {
353 kBtReceiverReferenceTime = 4,
354 kBtDlrr = 5,
355 kBtVoipMetric = 7
356};
asapersson@webrtc.org38599512013-11-12 08:08:26 +0000357
sprang73a93e82015-09-14 12:50:39 -0700358bool RtcpParseCommonHeader(const uint8_t* buffer,
359 size_t size_bytes,
360 RtcpCommonHeader* parsed_header);
niklase@google.com470e71d2011-07-07 08:21:25 +0000361
Erik Språng242e22b2015-05-11 10:17:43 +0200362class RTCPParserV2 {
363 public:
364 RTCPParserV2(
365 const uint8_t* rtcpData,
366 size_t rtcpDataLength,
367 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
368 ~RTCPParserV2();
niklase@google.com470e71d2011-07-07 08:21:25 +0000369
Erik Språng242e22b2015-05-11 10:17:43 +0200370 RTCPPacketTypes PacketType() const;
371 const RTCPPacket& Packet() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200372 rtcp::RtcpPacket* ReleaseRtcpPacket();
Erik Språng242e22b2015-05-11 10:17:43 +0200373 const RTCPRawPacket& RawPacket() const;
374 ptrdiff_t LengthLeft() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000375
Erik Språng242e22b2015-05-11 10:17:43 +0200376 bool IsValid() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200377 size_t NumSkippedBlocks() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000378
Erik Språng242e22b2015-05-11 10:17:43 +0200379 RTCPPacketTypes Begin();
380 RTCPPacketTypes Iterate();
niklase@google.com470e71d2011-07-07 08:21:25 +0000381
Erik Språng242e22b2015-05-11 10:17:43 +0200382 private:
383 enum class ParseState {
384 State_TopLevel, // Top level packet
385 State_ReportBlockItem, // SR/RR report block
386 State_SDESChunk, // SDES chunk
387 State_BYEItem, // BYE item
388 State_ExtendedJitterItem, // Extended jitter report item
389 State_RTPFB_NACKItem, // NACK FCI item
390 State_RTPFB_TMMBRItem, // TMMBR FCI item
391 State_RTPFB_TMMBNItem, // TMMBN FCI item
392 State_PSFB_SLIItem, // SLI FCI item
393 State_PSFB_RPSIItem, // RPSI FCI item
394 State_PSFB_FIRItem, // FIR FCI item
395 State_PSFB_AppItem, // Application specific FCI item
396 State_PSFB_REMBItem, // Application specific REMB item
397 State_XRItem,
398 State_XR_DLLRItem,
399 State_AppItem
400 };
niklase@google.com470e71d2011-07-07 08:21:25 +0000401
Erik Språng242e22b2015-05-11 10:17:43 +0200402 private:
403 void IterateTopLevel();
404 void IterateReportBlockItem();
405 void IterateSDESChunk();
406 void IterateBYEItem();
407 void IterateExtendedJitterItem();
408 void IterateNACKItem();
409 void IterateTMMBRItem();
410 void IterateTMMBNItem();
411 void IterateSLIItem();
412 void IterateRPSIItem();
413 void IterateFIRItem();
414 void IteratePsfbAppItem();
415 void IteratePsfbREMBItem();
416 void IterateAppItem();
417 void IterateXrItem();
418 void IterateXrDlrrItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000419
Erik Språng242e22b2015-05-11 10:17:43 +0200420 void Validate();
421 void EndCurrentBlock();
niklase@google.com470e71d2011-07-07 08:21:25 +0000422
Erik Språng242e22b2015-05-11 10:17:43 +0200423 bool ParseRR();
424 bool ParseSR();
425 bool ParseReportBlockItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000426
Erik Språng242e22b2015-05-11 10:17:43 +0200427 bool ParseSDES();
428 bool ParseSDESChunk();
429 bool ParseSDESItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000430
Erik Språng242e22b2015-05-11 10:17:43 +0200431 bool ParseBYE();
432 bool ParseBYEItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000433
Erik Språng242e22b2015-05-11 10:17:43 +0200434 bool ParseIJ();
435 bool ParseIJItem();
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000436
Erik Språng242e22b2015-05-11 10:17:43 +0200437 bool ParseXr();
438 bool ParseXrItem();
439 bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
440 bool ParseXrDlrr(int block_length_4bytes);
441 bool ParseXrDlrrItem();
442 bool ParseXrVoipMetricItem(int block_length_4bytes);
443 bool ParseXrUnsupportedBlockType(int block_length_4bytes);
niklase@google.com470e71d2011-07-07 08:21:25 +0000444
sprang73a93e82015-09-14 12:50:39 -0700445 bool ParseFBCommon(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200446 bool ParseNACKItem();
447 bool ParseTMMBRItem();
448 bool ParseTMMBNItem();
449 bool ParseSLIItem();
450 bool ParseRPSIItem();
451 bool ParseFIRItem();
452 bool ParsePsfbAppItem();
453 bool ParsePsfbREMBItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000454
sprang73a93e82015-09-14 12:50:39 -0700455 bool ParseAPP(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200456 bool ParseAPPItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000457
Erik Språng242e22b2015-05-11 10:17:43 +0200458 private:
459 const uint8_t* const _ptrRTCPDataBegin;
460 const bool _RTCPReducedSizeEnable;
461 const uint8_t* const _ptrRTCPDataEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000462
Erik Språng242e22b2015-05-11 10:17:43 +0200463 bool _validPacket;
464 const uint8_t* _ptrRTCPData;
465 const uint8_t* _ptrRTCPBlockEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000466
Erik Språng242e22b2015-05-11 10:17:43 +0200467 ParseState _state;
468 uint8_t _numberOfBlocks;
Erik Språng6b8d3552015-09-24 15:06:57 +0200469 size_t num_skipped_blocks_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000470
Erik Språng242e22b2015-05-11 10:17:43 +0200471 RTCPPacketTypes _packetType;
472 RTCPPacket _packet;
kwiberg84be5112016-04-27 01:19:58 -0700473 std::unique_ptr<webrtc::rtcp::RtcpPacket> rtcp_packet_;
Erik Språng242e22b2015-05-11 10:17:43 +0200474};
niklase@google.com470e71d2011-07-07 08:21:25 +0000475
Erik Språng242e22b2015-05-11 10:17:43 +0200476class RTCPPacketIterator {
477 public:
478 RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength);
479 ~RTCPPacketIterator();
niklase@google.com470e71d2011-07-07 08:21:25 +0000480
sprang73a93e82015-09-14 12:50:39 -0700481 const RtcpCommonHeader* Begin();
482 const RtcpCommonHeader* Iterate();
483 const RtcpCommonHeader* Current();
niklase@google.com470e71d2011-07-07 08:21:25 +0000484
Erik Språng242e22b2015-05-11 10:17:43 +0200485 private:
486 uint8_t* const _ptrBegin;
487 uint8_t* const _ptrEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000488
Erik Språng242e22b2015-05-11 10:17:43 +0200489 uint8_t* _ptrBlock;
niklase@google.com470e71d2011-07-07 08:21:25 +0000490
sprang73a93e82015-09-14 12:50:39 -0700491 RtcpCommonHeader _header;
Erik Språng242e22b2015-05-11 10:17:43 +0200492};
danilchap6a6f0892015-12-10 12:39:08 -0800493} // namespace RTCPUtility
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000494} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000495#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_