blob: e1f8737ec5a8e30b19ca070d91c3343c978550a6 [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
Erik Språng6b8d3552015-09-24 15:06:57 +020016#include "webrtc/base/scoped_ptr.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010017#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
pbos@webrtc.orga048d7c2013-05-29 14:27:38 +000018#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
19#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
21namespace webrtc {
Erik Språng6b8d3552015-09-24 15:06:57 +020022namespace rtcp {
23class RtcpPacket;
24}
niklase@google.com470e71d2011-07-07 08:21:25 +000025namespace RTCPUtility {
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +000026
27class NackStats {
28 public:
29 NackStats();
30 ~NackStats();
31
32 // Updates stats with requested sequence number.
33 // This function should be called for each NACK request to calculate the
34 // number of unique NACKed RTP packets.
35 void ReportRequest(uint16_t sequence_number);
36
37 // Gets the number of NACKed RTP packets.
38 uint32_t requests() const { return requests_; }
39
40 // Gets the number of unique NACKed RTP packets.
41 uint32_t unique_requests() const { return unique_requests_; }
42
43 private:
44 uint16_t max_sequence_number_;
45 uint32_t requests_;
46 uint32_t unique_requests_;
47};
48
Erik Språng242e22b2015-05-11 10:17:43 +020049uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +000050
Erik Språng242e22b2015-05-11 10:17:43 +020051// CNAME
52struct RTCPCnameInformation {
53 char name[RTCP_CNAME_SIZE];
54};
55struct RTCPPacketRR {
56 uint32_t SenderSSRC;
57 uint8_t NumberOfReportBlocks;
58};
59struct RTCPPacketSR {
60 uint32_t SenderSSRC;
61 uint8_t NumberOfReportBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +000062
Erik Språng242e22b2015-05-11 10:17:43 +020063 // sender info
64 uint32_t NTPMostSignificant;
65 uint32_t NTPLeastSignificant;
66 uint32_t RTPTimestamp;
67 uint32_t SenderPacketCount;
68 uint32_t SenderOctetCount;
69};
70struct RTCPPacketReportBlockItem {
71 // report block
72 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;
79};
80struct RTCPPacketSDESCName {
81 // RFC3550
82 uint32_t SenderSSRC;
83 char CName[RTCP_CNAME_SIZE];
84};
niklase@google.com470e71d2011-07-07 08:21:25 +000085
Erik Språng242e22b2015-05-11 10:17:43 +020086struct RTCPPacketExtendedJitterReportItem {
87 // RFC 5450
88 uint32_t Jitter;
89};
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000090
Erik Språng242e22b2015-05-11 10:17:43 +020091struct RTCPPacketBYE {
92 uint32_t SenderSSRC;
93};
94struct RTCPPacketXR {
95 // RFC 3611
96 uint32_t OriginatorSSRC;
97};
98struct RTCPPacketXRReceiverReferenceTimeItem {
99 // RFC 3611 4.4
100 uint32_t NTPMostSignificant;
101 uint32_t NTPLeastSignificant;
102};
103struct RTCPPacketXRDLRRReportBlockItem {
104 // RFC 3611 4.5
105 uint32_t SSRC;
106 uint32_t LastRR;
107 uint32_t DelayLastRR;
108};
109struct RTCPPacketXRVOIPMetricItem {
110 // RFC 3611 4.7
111 uint32_t SSRC;
112 uint8_t lossRate;
113 uint8_t discardRate;
114 uint8_t burstDensity;
115 uint8_t gapDensity;
116 uint16_t burstDuration;
117 uint16_t gapDuration;
118 uint16_t roundTripDelay;
119 uint16_t endSystemDelay;
120 uint8_t signalLevel;
121 uint8_t noiseLevel;
122 uint8_t RERL;
123 uint8_t Gmin;
124 uint8_t Rfactor;
125 uint8_t extRfactor;
126 uint8_t MOSLQ;
127 uint8_t MOSCQ;
128 uint8_t RXconfig;
129 uint16_t JBnominal;
130 uint16_t JBmax;
131 uint16_t JBabsMax;
132};
niklase@google.com470e71d2011-07-07 08:21:25 +0000133
Erik Språng242e22b2015-05-11 10:17:43 +0200134struct RTCPPacketRTPFBNACK {
135 uint32_t SenderSSRC;
136 uint32_t MediaSSRC;
137};
138struct RTCPPacketRTPFBNACKItem {
139 // RFC4585
140 uint16_t PacketID;
141 uint16_t BitMask;
142};
niklase@google.com470e71d2011-07-07 08:21:25 +0000143
Erik Språng242e22b2015-05-11 10:17:43 +0200144struct RTCPPacketRTPFBTMMBR {
145 uint32_t SenderSSRC;
146 uint32_t MediaSSRC; // zero!
147};
148struct RTCPPacketRTPFBTMMBRItem {
149 // RFC5104
150 uint32_t SSRC;
151 uint32_t MaxTotalMediaBitRate; // In Kbit/s
152 uint32_t MeasuredOverhead;
153};
niklase@google.com470e71d2011-07-07 08:21:25 +0000154
Erik Språng242e22b2015-05-11 10:17:43 +0200155struct RTCPPacketRTPFBTMMBN {
156 uint32_t SenderSSRC;
157 uint32_t MediaSSRC; // zero!
158};
159struct RTCPPacketRTPFBTMMBNItem {
160 // RFC5104
161 uint32_t SSRC; // "Owner"
162 uint32_t MaxTotalMediaBitRate;
163 uint32_t MeasuredOverhead;
164};
niklase@google.com470e71d2011-07-07 08:21:25 +0000165
Erik Språng242e22b2015-05-11 10:17:43 +0200166struct RTCPPacketPSFBFIR {
167 uint32_t SenderSSRC;
168 uint32_t MediaSSRC; // zero!
169};
170struct RTCPPacketPSFBFIRItem {
171 // RFC5104
172 uint32_t SSRC;
173 uint8_t CommandSequenceNumber;
174};
niklase@google.com470e71d2011-07-07 08:21:25 +0000175
Erik Språng242e22b2015-05-11 10:17:43 +0200176struct RTCPPacketPSFBPLI {
177 // RFC4585
178 uint32_t SenderSSRC;
179 uint32_t MediaSSRC;
180};
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
Erik Språng242e22b2015-05-11 10:17:43 +0200182struct RTCPPacketPSFBSLI {
183 // RFC4585
184 uint32_t SenderSSRC;
185 uint32_t MediaSSRC;
186};
187struct RTCPPacketPSFBSLIItem {
188 // RFC4585
189 uint16_t FirstMB;
190 uint16_t NumberOfMB;
191 uint8_t PictureId;
192};
193struct RTCPPacketPSFBRPSI {
194 // RFC4585
195 uint32_t SenderSSRC;
196 uint32_t MediaSSRC;
197 uint8_t PayloadType;
198 uint16_t NumberOfValidBits;
199 uint8_t NativeBitString[RTCP_RPSI_DATA_SIZE];
200};
201struct RTCPPacketPSFBAPP {
202 uint32_t SenderSSRC;
203 uint32_t MediaSSRC;
204};
205struct RTCPPacketPSFBREMBItem {
206 uint32_t BitRate;
207 uint8_t NumberOfSSRCs;
208 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
209};
210// generic name APP
211struct RTCPPacketAPP {
212 uint8_t SubType;
213 uint32_t Name;
214 uint8_t Data[kRtcpAppCode_DATA_SIZE];
215 uint16_t Size;
216};
niklase@google.com470e71d2011-07-07 08:21:25 +0000217
Erik Språng242e22b2015-05-11 10:17:43 +0200218union RTCPPacket {
219 RTCPPacketRR RR;
220 RTCPPacketSR SR;
221 RTCPPacketReportBlockItem ReportBlockItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000222
Erik Språng242e22b2015-05-11 10:17:43 +0200223 RTCPPacketSDESCName CName;
224 RTCPPacketBYE BYE;
niklase@google.com470e71d2011-07-07 08:21:25 +0000225
Erik Språng242e22b2015-05-11 10:17:43 +0200226 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000227
Erik Språng242e22b2015-05-11 10:17:43 +0200228 RTCPPacketRTPFBNACK NACK;
229 RTCPPacketRTPFBNACKItem NACKItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000230
Erik Språng242e22b2015-05-11 10:17:43 +0200231 RTCPPacketPSFBPLI PLI;
232 RTCPPacketPSFBSLI SLI;
233 RTCPPacketPSFBSLIItem SLIItem;
234 RTCPPacketPSFBRPSI RPSI;
235 RTCPPacketPSFBAPP PSFBAPP;
236 RTCPPacketPSFBREMBItem REMBItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000237
Erik Språng242e22b2015-05-11 10:17:43 +0200238 RTCPPacketRTPFBTMMBR TMMBR;
239 RTCPPacketRTPFBTMMBRItem TMMBRItem;
240 RTCPPacketRTPFBTMMBN TMMBN;
241 RTCPPacketRTPFBTMMBNItem TMMBNItem;
242 RTCPPacketPSFBFIR FIR;
243 RTCPPacketPSFBFIRItem FIRItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000244
Erik Språng242e22b2015-05-11 10:17:43 +0200245 RTCPPacketXR XR;
246 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
247 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
248 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000249
Erik Språng242e22b2015-05-11 10:17:43 +0200250 RTCPPacketAPP APP;
251};
niklase@google.com470e71d2011-07-07 08:21:25 +0000252
Erik Språng242e22b2015-05-11 10:17:43 +0200253enum class RTCPPacketTypes {
254 kInvalid,
niklase@google.com470e71d2011-07-07 08:21:25 +0000255
Erik Språng242e22b2015-05-11 10:17:43 +0200256 // RFC3550
257 kRr,
258 kSr,
259 kReportBlockItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000260
Erik Språng242e22b2015-05-11 10:17:43 +0200261 kSdes,
262 kSdesChunk,
263 kBye,
niklase@google.com470e71d2011-07-07 08:21:25 +0000264
Erik Språng242e22b2015-05-11 10:17:43 +0200265 // RFC5450
266 kExtendedIj,
267 kExtendedIjItem,
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000268
Erik Språng242e22b2015-05-11 10:17:43 +0200269 // RFC4585
270 kRtpfbNack,
271 kRtpfbNackItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000272
Erik Språng242e22b2015-05-11 10:17:43 +0200273 kPsfbPli,
274 kPsfbRpsi,
275 kPsfbSli,
276 kPsfbSliItem,
277 kPsfbApp,
278 kPsfbRemb,
279 kPsfbRembItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000280
Erik Språng242e22b2015-05-11 10:17:43 +0200281 // RFC5104
282 kRtpfbTmmbr,
283 kRtpfbTmmbrItem,
284 kRtpfbTmmbn,
285 kRtpfbTmmbnItem,
286 kPsfbFir,
287 kPsfbFirItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000288
Erik Språng242e22b2015-05-11 10:17:43 +0200289 // draft-perkins-avt-rapid-rtp-sync
290 kRtpfbSrReq,
niklase@google.com470e71d2011-07-07 08:21:25 +0000291
Erik Språng242e22b2015-05-11 10:17:43 +0200292 // RFC 3611
293 kXrHeader,
294 kXrReceiverReferenceTime,
295 kXrDlrrReportBlock,
296 kXrDlrrReportBlockItem,
297 kXrVoipMetric,
niklase@google.com470e71d2011-07-07 08:21:25 +0000298
Erik Språng242e22b2015-05-11 10:17:43 +0200299 kApp,
300 kAppItem,
Erik Språng6b8d3552015-09-24 15:06:57 +0200301
302 // draft-holmer-rmcat-transport-wide-cc-extensions
303 kTransportFeedback,
Erik Språng242e22b2015-05-11 10:17:43 +0200304};
niklase@google.com470e71d2011-07-07 08:21:25 +0000305
Erik Språng242e22b2015-05-11 10:17:43 +0200306struct RTCPRawPacket {
307 const uint8_t* _ptrPacketBegin;
308 const uint8_t* _ptrPacketEnd;
309};
niklase@google.com470e71d2011-07-07 08:21:25 +0000310
Erik Språng242e22b2015-05-11 10:17:43 +0200311struct RTCPModRawPacket {
312 uint8_t* _ptrPacketBegin;
313 uint8_t* _ptrPacketEnd;
314};
niklase@google.com470e71d2011-07-07 08:21:25 +0000315
sprang73a93e82015-09-14 12:50:39 -0700316struct RtcpCommonHeader {
317 static const uint8_t kHeaderSizeBytes = 4;
318 RtcpCommonHeader()
319 : version(2),
320 count_or_format(0),
321 packet_type(0),
322 payload_size_bytes(0),
323 padding_bytes(0) {}
324
325 uint32_t BlockSize() const {
326 return kHeaderSizeBytes + payload_size_bytes + padding_bytes;
327 }
328
329 uint8_t version;
330 uint8_t count_or_format;
331 uint8_t packet_type;
332 uint32_t payload_size_bytes;
333 uint8_t padding_bytes;
Erik Språng242e22b2015-05-11 10:17:43 +0200334};
niklase@google.com470e71d2011-07-07 08:21:25 +0000335
Erik Språng242e22b2015-05-11 10:17:43 +0200336enum RTCPPT : uint8_t {
337 PT_IJ = 195,
338 PT_SR = 200,
339 PT_RR = 201,
340 PT_SDES = 202,
341 PT_BYE = 203,
342 PT_APP = 204,
343 PT_RTPFB = 205,
344 PT_PSFB = 206,
345 PT_XR = 207
346};
niklase@google.com470e71d2011-07-07 08:21:25 +0000347
Erik Språng242e22b2015-05-11 10:17:43 +0200348// Extended report blocks, RFC 3611.
349enum RtcpXrBlockType : uint8_t {
350 kBtReceiverReferenceTime = 4,
351 kBtDlrr = 5,
352 kBtVoipMetric = 7
353};
asapersson@webrtc.org38599512013-11-12 08:08:26 +0000354
sprang73a93e82015-09-14 12:50:39 -0700355bool RtcpParseCommonHeader(const uint8_t* buffer,
356 size_t size_bytes,
357 RtcpCommonHeader* parsed_header);
niklase@google.com470e71d2011-07-07 08:21:25 +0000358
Erik Språng242e22b2015-05-11 10:17:43 +0200359class RTCPParserV2 {
360 public:
361 RTCPParserV2(
362 const uint8_t* rtcpData,
363 size_t rtcpDataLength,
364 bool rtcpReducedSizeEnable); // Set to true, to allow non-compound RTCP!
365 ~RTCPParserV2();
niklase@google.com470e71d2011-07-07 08:21:25 +0000366
Erik Språng242e22b2015-05-11 10:17:43 +0200367 RTCPPacketTypes PacketType() const;
368 const RTCPPacket& Packet() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200369 rtcp::RtcpPacket* ReleaseRtcpPacket();
Erik Språng242e22b2015-05-11 10:17:43 +0200370 const RTCPRawPacket& RawPacket() const;
371 ptrdiff_t LengthLeft() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000372
Erik Språng242e22b2015-05-11 10:17:43 +0200373 bool IsValid() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200374 size_t NumSkippedBlocks() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000375
Erik Språng242e22b2015-05-11 10:17:43 +0200376 RTCPPacketTypes Begin();
377 RTCPPacketTypes Iterate();
niklase@google.com470e71d2011-07-07 08:21:25 +0000378
Erik Språng242e22b2015-05-11 10:17:43 +0200379 private:
380 enum class ParseState {
381 State_TopLevel, // Top level packet
382 State_ReportBlockItem, // SR/RR report block
383 State_SDESChunk, // SDES chunk
384 State_BYEItem, // BYE item
385 State_ExtendedJitterItem, // Extended jitter report item
386 State_RTPFB_NACKItem, // NACK FCI item
387 State_RTPFB_TMMBRItem, // TMMBR FCI item
388 State_RTPFB_TMMBNItem, // TMMBN FCI item
389 State_PSFB_SLIItem, // SLI FCI item
390 State_PSFB_RPSIItem, // RPSI FCI item
391 State_PSFB_FIRItem, // FIR FCI item
392 State_PSFB_AppItem, // Application specific FCI item
393 State_PSFB_REMBItem, // Application specific REMB item
394 State_XRItem,
395 State_XR_DLLRItem,
396 State_AppItem
397 };
niklase@google.com470e71d2011-07-07 08:21:25 +0000398
Erik Språng242e22b2015-05-11 10:17:43 +0200399 private:
400 void IterateTopLevel();
401 void IterateReportBlockItem();
402 void IterateSDESChunk();
403 void IterateBYEItem();
404 void IterateExtendedJitterItem();
405 void IterateNACKItem();
406 void IterateTMMBRItem();
407 void IterateTMMBNItem();
408 void IterateSLIItem();
409 void IterateRPSIItem();
410 void IterateFIRItem();
411 void IteratePsfbAppItem();
412 void IteratePsfbREMBItem();
413 void IterateAppItem();
414 void IterateXrItem();
415 void IterateXrDlrrItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000416
Erik Språng242e22b2015-05-11 10:17:43 +0200417 void Validate();
418 void EndCurrentBlock();
niklase@google.com470e71d2011-07-07 08:21:25 +0000419
Erik Språng242e22b2015-05-11 10:17:43 +0200420 bool ParseRR();
421 bool ParseSR();
422 bool ParseReportBlockItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000423
Erik Språng242e22b2015-05-11 10:17:43 +0200424 bool ParseSDES();
425 bool ParseSDESChunk();
426 bool ParseSDESItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000427
Erik Språng242e22b2015-05-11 10:17:43 +0200428 bool ParseBYE();
429 bool ParseBYEItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000430
Erik Språng242e22b2015-05-11 10:17:43 +0200431 bool ParseIJ();
432 bool ParseIJItem();
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000433
Erik Språng242e22b2015-05-11 10:17:43 +0200434 bool ParseXr();
435 bool ParseXrItem();
436 bool ParseXrReceiverReferenceTimeItem(int block_length_4bytes);
437 bool ParseXrDlrr(int block_length_4bytes);
438 bool ParseXrDlrrItem();
439 bool ParseXrVoipMetricItem(int block_length_4bytes);
440 bool ParseXrUnsupportedBlockType(int block_length_4bytes);
niklase@google.com470e71d2011-07-07 08:21:25 +0000441
sprang73a93e82015-09-14 12:50:39 -0700442 bool ParseFBCommon(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200443 bool ParseNACKItem();
444 bool ParseTMMBRItem();
445 bool ParseTMMBNItem();
446 bool ParseSLIItem();
447 bool ParseRPSIItem();
448 bool ParseFIRItem();
449 bool ParsePsfbAppItem();
450 bool ParsePsfbREMBItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000451
sprang73a93e82015-09-14 12:50:39 -0700452 bool ParseAPP(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200453 bool ParseAPPItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000454
Erik Språng242e22b2015-05-11 10:17:43 +0200455 private:
456 const uint8_t* const _ptrRTCPDataBegin;
457 const bool _RTCPReducedSizeEnable;
458 const uint8_t* const _ptrRTCPDataEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000459
Erik Språng242e22b2015-05-11 10:17:43 +0200460 bool _validPacket;
461 const uint8_t* _ptrRTCPData;
462 const uint8_t* _ptrRTCPBlockEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000463
Erik Språng242e22b2015-05-11 10:17:43 +0200464 ParseState _state;
465 uint8_t _numberOfBlocks;
Erik Språng6b8d3552015-09-24 15:06:57 +0200466 size_t num_skipped_blocks_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000467
Erik Språng242e22b2015-05-11 10:17:43 +0200468 RTCPPacketTypes _packetType;
469 RTCPPacket _packet;
Erik Språng6b8d3552015-09-24 15:06:57 +0200470 rtc::scoped_ptr<webrtc::rtcp::RtcpPacket> rtcp_packet_;
Erik Språng242e22b2015-05-11 10:17:43 +0200471};
niklase@google.com470e71d2011-07-07 08:21:25 +0000472
Erik Språng242e22b2015-05-11 10:17:43 +0200473class RTCPPacketIterator {
474 public:
475 RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength);
476 ~RTCPPacketIterator();
niklase@google.com470e71d2011-07-07 08:21:25 +0000477
sprang73a93e82015-09-14 12:50:39 -0700478 const RtcpCommonHeader* Begin();
479 const RtcpCommonHeader* Iterate();
480 const RtcpCommonHeader* Current();
niklase@google.com470e71d2011-07-07 08:21:25 +0000481
Erik Språng242e22b2015-05-11 10:17:43 +0200482 private:
483 uint8_t* const _ptrBegin;
484 uint8_t* const _ptrEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000485
Erik Språng242e22b2015-05-11 10:17:43 +0200486 uint8_t* _ptrBlock;
niklase@google.com470e71d2011-07-07 08:21:25 +0000487
sprang73a93e82015-09-14 12:50:39 -0700488 RtcpCommonHeader _header;
Erik Språng242e22b2015-05-11 10:17:43 +0200489};
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000490} // RTCPUtility
491} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000492#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_