blob: 86fee8ea681af8182f7f20761445429086136b22 [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
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010018#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
pbos@webrtc.orga048d7c2013-05-29 14:27:38 +000019#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
20#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000021
22namespace webrtc {
Erik Språng6b8d3552015-09-24 15:06:57 +020023namespace rtcp {
24class RtcpPacket;
25}
niklase@google.com470e71d2011-07-07 08:21:25 +000026namespace RTCPUtility {
asapersson@webrtc.org2dd31342014-10-29 12:42:30 +000027
28class 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 uint32_t requests() const { return requests_; }
40
41 // Gets the number of unique NACKed RTP packets.
42 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
Erik Språng242e22b2015-05-11 10:17:43 +020050uint32_t MidNtp(uint32_t ntp_sec, uint32_t ntp_frac);
asapersson@webrtc.org8469f7b2013-10-02 13:15:34 +000051
Erik Språng242e22b2015-05-11 10:17:43 +020052struct RTCPPacketRR {
53 uint32_t SenderSSRC;
54 uint8_t NumberOfReportBlocks;
55};
56struct RTCPPacketSR {
57 uint32_t SenderSSRC;
58 uint8_t NumberOfReportBlocks;
niklase@google.com470e71d2011-07-07 08:21:25 +000059
Erik Språng242e22b2015-05-11 10:17:43 +020060 // sender info
61 uint32_t NTPMostSignificant;
62 uint32_t NTPLeastSignificant;
63 uint32_t RTPTimestamp;
64 uint32_t SenderPacketCount;
65 uint32_t SenderOctetCount;
66};
67struct 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};
77struct RTCPPacketSDESCName {
78 // RFC3550
79 uint32_t SenderSSRC;
80 char CName[RTCP_CNAME_SIZE];
81};
niklase@google.com470e71d2011-07-07 08:21:25 +000082
Erik Språng242e22b2015-05-11 10:17:43 +020083struct RTCPPacketExtendedJitterReportItem {
84 // RFC 5450
85 uint32_t Jitter;
86};
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000087
Erik Språng242e22b2015-05-11 10:17:43 +020088struct RTCPPacketBYE {
89 uint32_t SenderSSRC;
90};
91struct RTCPPacketXR {
92 // RFC 3611
93 uint32_t OriginatorSSRC;
94};
95struct RTCPPacketXRReceiverReferenceTimeItem {
96 // RFC 3611 4.4
97 uint32_t NTPMostSignificant;
98 uint32_t NTPLeastSignificant;
99};
100struct RTCPPacketXRDLRRReportBlockItem {
101 // RFC 3611 4.5
102 uint32_t SSRC;
103 uint32_t LastRR;
104 uint32_t DelayLastRR;
105};
106struct 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};
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
Erik Språng242e22b2015-05-11 10:17:43 +0200131struct RTCPPacketRTPFBNACK {
132 uint32_t SenderSSRC;
133 uint32_t MediaSSRC;
134};
135struct RTCPPacketRTPFBNACKItem {
136 // RFC4585
137 uint16_t PacketID;
138 uint16_t BitMask;
139};
niklase@google.com470e71d2011-07-07 08:21:25 +0000140
Erik Språng242e22b2015-05-11 10:17:43 +0200141struct RTCPPacketRTPFBTMMBR {
142 uint32_t SenderSSRC;
143 uint32_t MediaSSRC; // zero!
144};
145struct RTCPPacketRTPFBTMMBRItem {
146 // RFC5104
147 uint32_t SSRC;
148 uint32_t MaxTotalMediaBitRate; // In Kbit/s
149 uint32_t MeasuredOverhead;
150};
niklase@google.com470e71d2011-07-07 08:21:25 +0000151
Erik Språng242e22b2015-05-11 10:17:43 +0200152struct RTCPPacketRTPFBTMMBN {
153 uint32_t SenderSSRC;
154 uint32_t MediaSSRC; // zero!
155};
156struct RTCPPacketRTPFBTMMBNItem {
157 // RFC5104
158 uint32_t SSRC; // "Owner"
159 uint32_t MaxTotalMediaBitRate;
160 uint32_t MeasuredOverhead;
161};
niklase@google.com470e71d2011-07-07 08:21:25 +0000162
Erik Språng242e22b2015-05-11 10:17:43 +0200163struct RTCPPacketPSFBFIR {
164 uint32_t SenderSSRC;
165 uint32_t MediaSSRC; // zero!
166};
167struct RTCPPacketPSFBFIRItem {
168 // RFC5104
169 uint32_t SSRC;
170 uint8_t CommandSequenceNumber;
171};
niklase@google.com470e71d2011-07-07 08:21:25 +0000172
Erik Språng242e22b2015-05-11 10:17:43 +0200173struct RTCPPacketPSFBPLI {
174 // RFC4585
175 uint32_t SenderSSRC;
176 uint32_t MediaSSRC;
177};
niklase@google.com470e71d2011-07-07 08:21:25 +0000178
Erik Språng242e22b2015-05-11 10:17:43 +0200179struct RTCPPacketPSFBSLI {
180 // RFC4585
181 uint32_t SenderSSRC;
182 uint32_t MediaSSRC;
183};
184struct RTCPPacketPSFBSLIItem {
185 // RFC4585
186 uint16_t FirstMB;
187 uint16_t NumberOfMB;
188 uint8_t PictureId;
189};
190struct 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};
198struct RTCPPacketPSFBAPP {
199 uint32_t SenderSSRC;
200 uint32_t MediaSSRC;
201};
202struct RTCPPacketPSFBREMBItem {
203 uint32_t BitRate;
204 uint8_t NumberOfSSRCs;
205 uint32_t SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS];
206};
207// generic name APP
208struct RTCPPacketAPP {
209 uint8_t SubType;
210 uint32_t Name;
211 uint8_t Data[kRtcpAppCode_DATA_SIZE];
212 uint16_t Size;
213};
niklase@google.com470e71d2011-07-07 08:21:25 +0000214
Erik Språng242e22b2015-05-11 10:17:43 +0200215union RTCPPacket {
216 RTCPPacketRR RR;
217 RTCPPacketSR SR;
218 RTCPPacketReportBlockItem ReportBlockItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000219
Erik Språng242e22b2015-05-11 10:17:43 +0200220 RTCPPacketSDESCName CName;
221 RTCPPacketBYE BYE;
niklase@google.com470e71d2011-07-07 08:21:25 +0000222
Erik Språng242e22b2015-05-11 10:17:43 +0200223 RTCPPacketExtendedJitterReportItem ExtendedJitterReportItem;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000224
Erik Språng242e22b2015-05-11 10:17:43 +0200225 RTCPPacketRTPFBNACK NACK;
226 RTCPPacketRTPFBNACKItem NACKItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000227
Erik Språng242e22b2015-05-11 10:17:43 +0200228 RTCPPacketPSFBPLI PLI;
229 RTCPPacketPSFBSLI SLI;
230 RTCPPacketPSFBSLIItem SLIItem;
231 RTCPPacketPSFBRPSI RPSI;
232 RTCPPacketPSFBAPP PSFBAPP;
233 RTCPPacketPSFBREMBItem REMBItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000234
Erik Språng242e22b2015-05-11 10:17:43 +0200235 RTCPPacketRTPFBTMMBR TMMBR;
236 RTCPPacketRTPFBTMMBRItem TMMBRItem;
237 RTCPPacketRTPFBTMMBN TMMBN;
238 RTCPPacketRTPFBTMMBNItem TMMBNItem;
239 RTCPPacketPSFBFIR FIR;
240 RTCPPacketPSFBFIRItem FIRItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000241
Erik Språng242e22b2015-05-11 10:17:43 +0200242 RTCPPacketXR XR;
243 RTCPPacketXRReceiverReferenceTimeItem XRReceiverReferenceTimeItem;
244 RTCPPacketXRDLRRReportBlockItem XRDLRRReportBlockItem;
245 RTCPPacketXRVOIPMetricItem XRVOIPMetricItem;
niklase@google.com470e71d2011-07-07 08:21:25 +0000246
Erik Språng242e22b2015-05-11 10:17:43 +0200247 RTCPPacketAPP APP;
248};
niklase@google.com470e71d2011-07-07 08:21:25 +0000249
Erik Språng242e22b2015-05-11 10:17:43 +0200250enum class RTCPPacketTypes {
251 kInvalid,
niklase@google.com470e71d2011-07-07 08:21:25 +0000252
Erik Språng242e22b2015-05-11 10:17:43 +0200253 // RFC3550
254 kRr,
255 kSr,
256 kReportBlockItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000257
Erik Språng242e22b2015-05-11 10:17:43 +0200258 kSdes,
259 kSdesChunk,
260 kBye,
niklase@google.com470e71d2011-07-07 08:21:25 +0000261
Erik Språng242e22b2015-05-11 10:17:43 +0200262 // RFC5450
263 kExtendedIj,
264 kExtendedIjItem,
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000265
Erik Språng242e22b2015-05-11 10:17:43 +0200266 // RFC4585
267 kRtpfbNack,
268 kRtpfbNackItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000269
Erik Språng242e22b2015-05-11 10:17:43 +0200270 kPsfbPli,
271 kPsfbRpsi,
danilchap90a13512016-04-11 10:05:02 -0700272 kPsfbRpsiItem,
Erik Språng242e22b2015-05-11 10:17:43 +0200273 kPsfbSli,
274 kPsfbSliItem,
275 kPsfbApp,
276 kPsfbRemb,
277 kPsfbRembItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000278
Erik Språng242e22b2015-05-11 10:17:43 +0200279 // RFC5104
280 kRtpfbTmmbr,
281 kRtpfbTmmbrItem,
282 kRtpfbTmmbn,
283 kRtpfbTmmbnItem,
284 kPsfbFir,
285 kPsfbFirItem,
niklase@google.com470e71d2011-07-07 08:21:25 +0000286
Erik Språng242e22b2015-05-11 10:17:43 +0200287 // draft-perkins-avt-rapid-rtp-sync
288 kRtpfbSrReq,
niklase@google.com470e71d2011-07-07 08:21:25 +0000289
Erik Språng242e22b2015-05-11 10:17:43 +0200290 // RFC 3611
291 kXrHeader,
292 kXrReceiverReferenceTime,
293 kXrDlrrReportBlock,
294 kXrDlrrReportBlockItem,
295 kXrVoipMetric,
niklase@google.com470e71d2011-07-07 08:21:25 +0000296
Erik Språng242e22b2015-05-11 10:17:43 +0200297 kApp,
298 kAppItem,
Erik Språng6b8d3552015-09-24 15:06:57 +0200299
300 // draft-holmer-rmcat-transport-wide-cc-extensions
301 kTransportFeedback,
Erik Språng242e22b2015-05-11 10:17:43 +0200302};
niklase@google.com470e71d2011-07-07 08:21:25 +0000303
Erik Språng242e22b2015-05-11 10:17:43 +0200304struct RTCPRawPacket {
305 const uint8_t* _ptrPacketBegin;
306 const uint8_t* _ptrPacketEnd;
307};
niklase@google.com470e71d2011-07-07 08:21:25 +0000308
Erik Språng242e22b2015-05-11 10:17:43 +0200309struct RTCPModRawPacket {
310 uint8_t* _ptrPacketBegin;
311 uint8_t* _ptrPacketEnd;
312};
niklase@google.com470e71d2011-07-07 08:21:25 +0000313
sprang73a93e82015-09-14 12:50:39 -0700314struct RtcpCommonHeader {
315 static const uint8_t kHeaderSizeBytes = 4;
316 RtcpCommonHeader()
317 : version(2),
318 count_or_format(0),
319 packet_type(0),
320 payload_size_bytes(0),
321 padding_bytes(0) {}
322
323 uint32_t BlockSize() const {
324 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;
Erik Språng242e22b2015-05-11 10:17:43 +0200332};
niklase@google.com470e71d2011-07-07 08:21:25 +0000333
Erik Språng242e22b2015-05-11 10:17:43 +0200334enum 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};
niklase@google.com470e71d2011-07-07 08:21:25 +0000345
Erik Språng242e22b2015-05-11 10:17:43 +0200346// Extended report blocks, RFC 3611.
347enum RtcpXrBlockType : uint8_t {
348 kBtReceiverReferenceTime = 4,
349 kBtDlrr = 5,
350 kBtVoipMetric = 7
351};
asapersson@webrtc.org38599512013-11-12 08:08:26 +0000352
sprang73a93e82015-09-14 12:50:39 -0700353bool RtcpParseCommonHeader(const uint8_t* buffer,
354 size_t size_bytes,
355 RtcpCommonHeader* parsed_header);
niklase@google.com470e71d2011-07-07 08:21:25 +0000356
Erik Språng242e22b2015-05-11 10:17:43 +0200357class 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();
niklase@google.com470e71d2011-07-07 08:21:25 +0000364
Erik Språng242e22b2015-05-11 10:17:43 +0200365 RTCPPacketTypes PacketType() const;
366 const RTCPPacket& Packet() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200367 rtcp::RtcpPacket* ReleaseRtcpPacket();
Erik Språng242e22b2015-05-11 10:17:43 +0200368 const RTCPRawPacket& RawPacket() const;
369 ptrdiff_t LengthLeft() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000370
Erik Språng242e22b2015-05-11 10:17:43 +0200371 bool IsValid() const;
Erik Språng6b8d3552015-09-24 15:06:57 +0200372 size_t NumSkippedBlocks() const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000373
Erik Språng242e22b2015-05-11 10:17:43 +0200374 RTCPPacketTypes Begin();
375 RTCPPacketTypes Iterate();
niklase@google.com470e71d2011-07-07 08:21:25 +0000376
Erik Språng242e22b2015-05-11 10:17:43 +0200377 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 };
niklase@google.com470e71d2011-07-07 08:21:25 +0000396
Erik Språng242e22b2015-05-11 10:17:43 +0200397 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();
niklase@google.com470e71d2011-07-07 08:21:25 +0000414
Erik Språng242e22b2015-05-11 10:17:43 +0200415 void Validate();
416 void EndCurrentBlock();
niklase@google.com470e71d2011-07-07 08:21:25 +0000417
Erik Språng242e22b2015-05-11 10:17:43 +0200418 bool ParseRR();
419 bool ParseSR();
420 bool ParseReportBlockItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000421
Erik Språng242e22b2015-05-11 10:17:43 +0200422 bool ParseSDES();
423 bool ParseSDESChunk();
424 bool ParseSDESItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000425
Erik Språng242e22b2015-05-11 10:17:43 +0200426 bool ParseBYE();
427 bool ParseBYEItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000428
Erik Språng242e22b2015-05-11 10:17:43 +0200429 bool ParseIJ();
430 bool ParseIJItem();
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000431
Erik Språng242e22b2015-05-11 10:17:43 +0200432 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);
niklase@google.com470e71d2011-07-07 08:21:25 +0000439
sprang73a93e82015-09-14 12:50:39 -0700440 bool ParseFBCommon(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200441 bool ParseNACKItem();
442 bool ParseTMMBRItem();
443 bool ParseTMMBNItem();
444 bool ParseSLIItem();
445 bool ParseRPSIItem();
446 bool ParseFIRItem();
447 bool ParsePsfbAppItem();
448 bool ParsePsfbREMBItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000449
sprang73a93e82015-09-14 12:50:39 -0700450 bool ParseAPP(const RtcpCommonHeader& header);
Erik Språng242e22b2015-05-11 10:17:43 +0200451 bool ParseAPPItem();
niklase@google.com470e71d2011-07-07 08:21:25 +0000452
Erik Språng242e22b2015-05-11 10:17:43 +0200453 private:
454 const uint8_t* const _ptrRTCPDataBegin;
455 const bool _RTCPReducedSizeEnable;
456 const uint8_t* const _ptrRTCPDataEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000457
Erik Språng242e22b2015-05-11 10:17:43 +0200458 bool _validPacket;
459 const uint8_t* _ptrRTCPData;
460 const uint8_t* _ptrRTCPBlockEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000461
Erik Språng242e22b2015-05-11 10:17:43 +0200462 ParseState _state;
463 uint8_t _numberOfBlocks;
Erik Språng6b8d3552015-09-24 15:06:57 +0200464 size_t num_skipped_blocks_;
niklase@google.com470e71d2011-07-07 08:21:25 +0000465
Erik Språng242e22b2015-05-11 10:17:43 +0200466 RTCPPacketTypes _packetType;
467 RTCPPacket _packet;
kwiberg84be5112016-04-27 01:19:58 -0700468 std::unique_ptr<webrtc::rtcp::RtcpPacket> rtcp_packet_;
Erik Språng242e22b2015-05-11 10:17:43 +0200469};
niklase@google.com470e71d2011-07-07 08:21:25 +0000470
Erik Språng242e22b2015-05-11 10:17:43 +0200471class RTCPPacketIterator {
472 public:
473 RTCPPacketIterator(uint8_t* rtcpData, size_t rtcpDataLength);
474 ~RTCPPacketIterator();
niklase@google.com470e71d2011-07-07 08:21:25 +0000475
sprang73a93e82015-09-14 12:50:39 -0700476 const RtcpCommonHeader* Begin();
477 const RtcpCommonHeader* Iterate();
478 const RtcpCommonHeader* Current();
niklase@google.com470e71d2011-07-07 08:21:25 +0000479
Erik Språng242e22b2015-05-11 10:17:43 +0200480 private:
481 uint8_t* const _ptrBegin;
482 uint8_t* const _ptrEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000483
Erik Språng242e22b2015-05-11 10:17:43 +0200484 uint8_t* _ptrBlock;
niklase@google.com470e71d2011-07-07 08:21:25 +0000485
sprang73a93e82015-09-14 12:50:39 -0700486 RtcpCommonHeader _header;
Erik Språng242e22b2015-05-11 10:17:43 +0200487};
danilchap6a6f0892015-12-10 12:39:08 -0800488} // namespace RTCPUtility
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000489} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000490#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_UTILITY_H_