blob: 8e7e983f9a208b2381d2e284fd97702c753c8dc7 [file] [log] [blame]
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +00001/*
2 * Copyright (c) 2014 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
12#ifndef WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_
13#define WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_
14
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000015#include <map>
16#include <string>
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000017#include <vector>
18
Erik Språngc1b9d4e2015-06-08 09:54:14 +020019#include "webrtc/base/scoped_ptr.h"
danilchapdf948f02015-11-13 03:03:13 -080020#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/report_block.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000021#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010022#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000023#include "webrtc/typedefs.h"
24
25namespace webrtc {
26namespace rtcp {
27
Erik Språngc1b9d4e2015-06-08 09:54:14 +020028static const int kCommonFbFmtLength = 12;
29static const int kReportBlockLength = 24;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000030
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000031class Dlrr;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000032class RawPacket;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +000033class Rrtr;
34class VoipMetric;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000035
36// Class for building RTCP packets.
37//
38// Example:
39// ReportBlock report_block;
40// report_block.To(234)
41// report_block.FractionLost(10);
42//
43// ReceiverReport rr;
44// rr.From(123);
45// rr.WithReportBlock(&report_block)
46//
47// Fir fir;
48// fir.From(123);
49// fir.To(234)
50// fir.WithCommandSeqNum(123);
51//
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000052// size_t length = 0; // Builds an intra frame request
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000053// uint8_t packet[kPacketSize]; // with sequence number 123.
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000054// fir.Build(packet, &length, kPacketSize);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000055//
56// RawPacket packet = fir.Build(); // Returns a RawPacket holding
57// // the built rtcp packet.
58//
59// rr.Append(&fir) // Builds a compound RTCP packet with
60// RawPacket packet = rr.Build(); // a receiver report, report block
61// // and fir message.
62
63class RtcpPacket {
64 public:
65 virtual ~RtcpPacket() {}
66
67 void Append(RtcpPacket* packet);
68
Erik Språngc1b9d4e2015-06-08 09:54:14 +020069 // Callback used to signal that an RTCP packet is ready. Note that this may
70 // not contain all data in this RtcpPacket; if a packet cannot fit in
71 // max_length bytes, it will be fragmented and multiple calls to this
72 // callback will be made.
73 class PacketReadyCallback {
74 public:
75 PacketReadyCallback() {}
76 virtual ~PacketReadyCallback() {}
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000077
Erik Språngc1b9d4e2015-06-08 09:54:14 +020078 virtual void OnPacketReady(uint8_t* data, size_t length) = 0;
79 };
80
81 // Convenience method mostly used for test. Max length of IP_PACKET_SIZE is
82 // used, will cause assertion error if fragmentation occurs.
83 rtc::scoped_ptr<RawPacket> Build() const;
84
85 // Returns true if all calls to Create succeeded. A buffer of size
86 // IP_PACKET_SIZE will be allocated and reused between calls to callback.
87 bool Build(PacketReadyCallback* callback) const;
88
89 // Returns true if all calls to Create succeeded. Provided buffer reference
90 // will be used for all calls to callback.
91 bool BuildExternalBuffer(uint8_t* buffer,
92 size_t max_length,
93 PacketReadyCallback* callback) const;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000094
Erik Språng6b8d3552015-09-24 15:06:57 +020095 // Size of this packet in bytes (including headers, excluding nested packets).
96 virtual size_t BlockLength() const = 0;
97
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000098 protected:
Erik Språnga3b87692015-07-29 10:46:54 +020099 RtcpPacket() {}
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000100
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200101 virtual bool Create(uint8_t* packet,
102 size_t* index,
103 size_t max_length,
104 PacketReadyCallback* callback) const = 0;
105
sprang73a93e82015-09-14 12:50:39 -0700106 static void CreateHeader(uint8_t count_or_format,
107 uint8_t packet_type,
108 size_t block_length, // Size in 32bit words - 1.
109 uint8_t* buffer,
110 size_t* pos);
Erik Språnga3b87692015-07-29 10:46:54 +0200111
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200112 bool OnBufferFull(uint8_t* packet,
113 size_t* index,
114 RtcpPacket::PacketReadyCallback* callback) const;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000115
Erik Språnga3b87692015-07-29 10:46:54 +0200116 size_t HeaderLength() const;
117
118 static const size_t kHeaderLength = 4;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000119
120 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200121 bool CreateAndAddAppended(uint8_t* packet,
122 size_t* index,
123 size_t max_length,
124 PacketReadyCallback* callback) const;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000125
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000126 std::vector<RtcpPacket*> appended_packets_;
127};
128
Erik Språnga3b87692015-07-29 10:46:54 +0200129// TODO(sprang): Move RtcpPacket subclasses out to separate files.
130
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000131class Empty : public RtcpPacket {
132 public:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000133 Empty() : RtcpPacket() {}
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000134
135 virtual ~Empty() {}
136
137 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200138 bool Create(uint8_t* packet,
139 size_t* index,
140 size_t max_length,
141 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000142
Erik Språnga3b87692015-07-29 10:46:54 +0200143 size_t BlockLength() const override;
144
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000145 private:
henrikg3c089d72015-09-16 05:37:44 -0700146 RTC_DISALLOW_COPY_AND_ASSIGN(Empty);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000147};
148
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000149// RTCP sender report (RFC 3550).
150//
151// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
152// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153// |V=2|P| RC | PT=SR=200 | length |
154// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
155// | SSRC of sender |
156// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
157// | NTP timestamp, most significant word |
158// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
159// | NTP timestamp, least significant word |
160// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161// | RTP timestamp |
162// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
163// | sender's packet count |
164// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
165// | sender's octet count |
166// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
167// | report block(s) |
168// | .... |
169
170class SenderReport : public RtcpPacket {
171 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000172 SenderReport() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000173 memset(&sr_, 0, sizeof(sr_));
174 }
175
176 virtual ~SenderReport() {}
177
178 void From(uint32_t ssrc) {
179 sr_.SenderSSRC = ssrc;
180 }
181 void WithNtpSec(uint32_t sec) {
182 sr_.NTPMostSignificant = sec;
183 }
184 void WithNtpFrac(uint32_t frac) {
185 sr_.NTPLeastSignificant = frac;
186 }
187 void WithRtpTimestamp(uint32_t rtp_timestamp) {
188 sr_.RTPTimestamp = rtp_timestamp;
189 }
190 void WithPacketCount(uint32_t packet_count) {
191 sr_.SenderPacketCount = packet_count;
192 }
193 void WithOctetCount(uint32_t octet_count) {
194 sr_.SenderOctetCount = octet_count;
195 }
Erik Språngbdc0b0d2015-06-22 15:21:24 +0200196 bool WithReportBlock(const ReportBlock& block);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000197
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000198 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200199 bool Create(uint8_t* packet,
200 size_t* index,
201 size_t max_length,
202 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000203
204 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200205 static const int kMaxNumberOfReportBlocks = 0x1f;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000206
207 size_t BlockLength() const {
208 const size_t kSrHeaderLength = 8;
209 const size_t kSenderInfoLength = 20;
210 return kSrHeaderLength + kSenderInfoLength +
211 report_blocks_.size() * kReportBlockLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000212 }
213
214 RTCPUtility::RTCPPacketSR sr_;
danilchapdf948f02015-11-13 03:03:13 -0800215 std::vector<ReportBlock> report_blocks_;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000216
henrikg3c089d72015-09-16 05:37:44 -0700217 RTC_DISALLOW_COPY_AND_ASSIGN(SenderReport);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000218};
219
220//
221// RTCP receiver report (RFC 3550).
222//
223// 0 1 2 3
224// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
225// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
226// |V=2|P| RC | PT=RR=201 | length |
227// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
228// | SSRC of packet sender |
229// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
230// | report block(s) |
231// | .... |
232
233class ReceiverReport : public RtcpPacket {
234 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000235 ReceiverReport() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000236 memset(&rr_, 0, sizeof(rr_));
237 }
238
239 virtual ~ReceiverReport() {}
240
241 void From(uint32_t ssrc) {
242 rr_.SenderSSRC = ssrc;
243 }
Erik Språngbdc0b0d2015-06-22 15:21:24 +0200244 bool WithReportBlock(const ReportBlock& block);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000245
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000246 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200247 bool Create(uint8_t* packet,
248 size_t* index,
249 size_t max_length,
250 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000251
252 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200253 static const int kMaxNumberOfReportBlocks = 0x1F;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000254
255 size_t BlockLength() const {
256 const size_t kRrHeaderLength = 8;
257 return kRrHeaderLength + report_blocks_.size() * kReportBlockLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000258 }
259
260 RTCPUtility::RTCPPacketRR rr_;
danilchapdf948f02015-11-13 03:03:13 -0800261 std::vector<ReportBlock> report_blocks_;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000262
henrikg3c089d72015-09-16 05:37:44 -0700263 RTC_DISALLOW_COPY_AND_ASSIGN(ReceiverReport);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000264};
265
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000266// Source Description (SDES) (RFC 3550).
267//
268// 0 1 2 3
269// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
270// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
271// header |V=2|P| SC | PT=SDES=202 | length |
272// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
273// chunk | SSRC/CSRC_1 |
274// 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
275// | SDES items |
276// | ... |
277// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
278// chunk | SSRC/CSRC_2 |
279// 2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
280// | SDES items |
281// | ... |
282// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
283//
284// Canonical End-Point Identifier SDES Item (CNAME)
285//
286// 0 1 2 3
287// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
288// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
289// | CNAME=1 | length | user and domain name ...
290// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
291
292class Sdes : public RtcpPacket {
293 public:
294 Sdes() : RtcpPacket() {}
295
296 virtual ~Sdes() {}
297
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200298 bool WithCName(uint32_t ssrc, const std::string& cname);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000299
300 struct Chunk {
301 uint32_t ssrc;
302 std::string name;
303 int null_octets;
304 };
305
306 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200307 bool Create(uint8_t* packet,
308 size_t* index,
309 size_t max_length,
310 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000311
312 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200313 static const int kMaxNumberOfChunks = 0x1f;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000314
315 size_t BlockLength() const;
316
317 std::vector<Chunk> chunks_;
318
henrikg3c089d72015-09-16 05:37:44 -0700319 RTC_DISALLOW_COPY_AND_ASSIGN(Sdes);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000320};
321
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000322// Slice loss indication (SLI) (RFC 4585).
323//
324// FCI:
325// 0 1 2 3
326// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
327// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
328// | First | Number | PictureID |
329// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
330
331class Sli : public RtcpPacket {
332 public:
333 Sli() : RtcpPacket() {
334 memset(&sli_, 0, sizeof(sli_));
335 memset(&sli_item_, 0, sizeof(sli_item_));
336 }
337
338 virtual ~Sli() {}
339
340 void From(uint32_t ssrc) {
341 sli_.SenderSSRC = ssrc;
342 }
343 void To(uint32_t ssrc) {
344 sli_.MediaSSRC = ssrc;
345 }
346 void WithFirstMb(uint16_t first_mb) {
347 assert(first_mb <= 0x1fff);
348 sli_item_.FirstMB = first_mb;
349 }
350 void WithNumberOfMb(uint16_t number_mb) {
351 assert(number_mb <= 0x1fff);
352 sli_item_.NumberOfMB = number_mb;
353 }
354 void WithPictureId(uint8_t picture_id) {
355 assert(picture_id <= 0x3f);
356 sli_item_.PictureId = picture_id;
357 }
358
359 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200360 bool Create(uint8_t* packet,
361 size_t* index,
362 size_t max_length,
363 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000364
365 private:
366 size_t BlockLength() const {
367 const size_t kFciLength = 4;
368 return kCommonFbFmtLength + kFciLength;
369 }
370
371 RTCPUtility::RTCPPacketPSFBSLI sli_;
372 RTCPUtility::RTCPPacketPSFBSLIItem sli_item_;
373
henrikg3c089d72015-09-16 05:37:44 -0700374 RTC_DISALLOW_COPY_AND_ASSIGN(Sli);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000375};
376
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000377// Generic NACK (RFC 4585).
378//
379// FCI:
380// 0 1 2 3
381// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
382// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
383// | PID | BLP |
384// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
385
386class Nack : public RtcpPacket {
387 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000388 Nack() : RtcpPacket() {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000389 memset(&nack_, 0, sizeof(nack_));
390 }
391
392 virtual ~Nack() {}
393
394 void From(uint32_t ssrc) {
395 nack_.SenderSSRC = ssrc;
396 }
397 void To(uint32_t ssrc) {
398 nack_.MediaSSRC = ssrc;
399 }
400 void WithList(const uint16_t* nack_list, int length);
401
402 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200403 bool Create(uint8_t* packet,
404 size_t* index,
405 size_t max_length,
406 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000407
Erik Språnga3b87692015-07-29 10:46:54 +0200408 size_t BlockLength() const override;
409
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000410 private:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000411
412 RTCPUtility::RTCPPacketRTPFBNACK nack_;
413 std::vector<RTCPUtility::RTCPPacketRTPFBNACKItem> nack_fields_;
414
henrikg3c089d72015-09-16 05:37:44 -0700415 RTC_DISALLOW_COPY_AND_ASSIGN(Nack);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000416};
417
418// Reference picture selection indication (RPSI) (RFC 4585).
419//
420// FCI:
421//
422// 0 1 2 3
423// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
424// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
425// | PB |0| Payload Type| Native RPSI bit string |
426// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
427// | defined per codec ... | Padding (0) |
428// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
429
430class Rpsi : public RtcpPacket {
431 public:
432 Rpsi()
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000433 : RtcpPacket(),
434 padding_bytes_(0) {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000435 memset(&rpsi_, 0, sizeof(rpsi_));
436 }
437
438 virtual ~Rpsi() {}
439
440 void From(uint32_t ssrc) {
441 rpsi_.SenderSSRC = ssrc;
442 }
443 void To(uint32_t ssrc) {
444 rpsi_.MediaSSRC = ssrc;
445 }
446 void WithPayloadType(uint8_t payload) {
447 assert(payload <= 0x7f);
448 rpsi_.PayloadType = payload;
449 }
450 void WithPictureId(uint64_t picture_id);
451
452 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200453 bool Create(uint8_t* packet,
454 size_t* index,
455 size_t max_length,
456 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000457
458 private:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000459 size_t BlockLength() const {
460 size_t fci_length = 2 + (rpsi_.NumberOfValidBits / 8) + padding_bytes_;
461 return kCommonFbFmtLength + fci_length;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000462 }
463
464 uint8_t padding_bytes_;
465 RTCPUtility::RTCPPacketPSFBRPSI rpsi_;
466
henrikg3c089d72015-09-16 05:37:44 -0700467 RTC_DISALLOW_COPY_AND_ASSIGN(Rpsi);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000468};
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000469
470// Full intra request (FIR) (RFC 5104).
471//
472// FCI:
473//
474// 0 1 2 3
475// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
476// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
477// | SSRC |
478// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
479// | Seq nr. | Reserved |
480// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
481
482class Fir : public RtcpPacket {
483 public:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000484 Fir() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000485 memset(&fir_, 0, sizeof(fir_));
486 memset(&fir_item_, 0, sizeof(fir_item_));
487 }
488
489 virtual ~Fir() {}
490
491 void From(uint32_t ssrc) {
492 fir_.SenderSSRC = ssrc;
493 }
494 void To(uint32_t ssrc) {
495 fir_item_.SSRC = ssrc;
496 }
497 void WithCommandSeqNum(uint8_t seq_num) {
498 fir_item_.CommandSequenceNumber = seq_num;
499 }
500
501 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200502 bool Create(uint8_t* packet,
503 size_t* index,
504 size_t max_length,
505 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000506
507 private:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000508 size_t BlockLength() const {
509 const size_t kFciLength = 8;
510 return kCommonFbFmtLength + kFciLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000511 }
512
513 RTCPUtility::RTCPPacketPSFBFIR fir_;
514 RTCPUtility::RTCPPacketPSFBFIRItem fir_item_;
515};
516
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000517// Temporary Maximum Media Stream Bit Rate Request (TMMBR) (RFC 5104).
518//
519// FCI:
520//
521// 0 1 2 3
522// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
523// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
524// | SSRC |
525// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
526// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
527// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
528
529class Tmmbr : public RtcpPacket {
530 public:
531 Tmmbr() : RtcpPacket() {
532 memset(&tmmbr_, 0, sizeof(tmmbr_));
533 memset(&tmmbr_item_, 0, sizeof(tmmbr_item_));
534 }
535
536 virtual ~Tmmbr() {}
537
538 void From(uint32_t ssrc) {
539 tmmbr_.SenderSSRC = ssrc;
540 }
541 void To(uint32_t ssrc) {
542 tmmbr_item_.SSRC = ssrc;
543 }
544 void WithBitrateKbps(uint32_t bitrate_kbps) {
545 tmmbr_item_.MaxTotalMediaBitRate = bitrate_kbps;
546 }
547 void WithOverhead(uint16_t overhead) {
548 assert(overhead <= 0x1ff);
549 tmmbr_item_.MeasuredOverhead = overhead;
550 }
551
552 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200553 bool Create(uint8_t* packet,
554 size_t* index,
555 size_t max_length,
556 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000557
558 private:
559 size_t BlockLength() const {
560 const size_t kFciLen = 8;
561 return kCommonFbFmtLength + kFciLen;
562 }
563
564 RTCPUtility::RTCPPacketRTPFBTMMBR tmmbr_;
565 RTCPUtility::RTCPPacketRTPFBTMMBRItem tmmbr_item_;
566
henrikg3c089d72015-09-16 05:37:44 -0700567 RTC_DISALLOW_COPY_AND_ASSIGN(Tmmbr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000568};
569
570// Temporary Maximum Media Stream Bit Rate Notification (TMMBN) (RFC 5104).
571//
572// FCI:
573//
574// 0 1 2 3
575// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
576// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
577// | SSRC |
578// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
579// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
580// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
581
582class Tmmbn : public RtcpPacket {
583 public:
584 Tmmbn() : RtcpPacket() {
585 memset(&tmmbn_, 0, sizeof(tmmbn_));
586 }
587
588 virtual ~Tmmbn() {}
589
590 void From(uint32_t ssrc) {
591 tmmbn_.SenderSSRC = ssrc;
592 }
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200593 // Max 50 TMMBR can be added per TMMBN.
594 bool WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000595
596 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200597 bool Create(uint8_t* packet,
598 size_t* index,
599 size_t max_length,
600 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000601
602 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200603 static const int kMaxNumberOfTmmbrs = 50;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000604
605 size_t BlockLength() const {
606 const size_t kFciLen = 8;
607 return kCommonFbFmtLength + kFciLen * tmmbn_items_.size();
608 }
609
610 RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_;
611 std::vector<RTCPUtility::RTCPPacketRTPFBTMMBRItem> tmmbn_items_;
612
henrikg3c089d72015-09-16 05:37:44 -0700613 RTC_DISALLOW_COPY_AND_ASSIGN(Tmmbn);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000614};
615
616// Receiver Estimated Max Bitrate (REMB) (draft-alvestrand-rmcat-remb).
617//
618// 0 1 2 3
619// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
620// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
621// |V=2|P| FMT=15 | PT=206 | length |
622// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
623// | SSRC of packet sender |
624// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
625// | SSRC of media source |
626// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
627// | Unique identifier 'R' 'E' 'M' 'B' |
628// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
629// | Num SSRC | BR Exp | BR Mantissa |
630// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
631// | SSRC feedback |
632// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
633// | ...
634
635class Remb : public RtcpPacket {
636 public:
637 Remb() : RtcpPacket() {
638 memset(&remb_, 0, sizeof(remb_));
639 memset(&remb_item_, 0, sizeof(remb_item_));
640 }
641
642 virtual ~Remb() {}
643
644 void From(uint32_t ssrc) {
645 remb_.SenderSSRC = ssrc;
646 }
647 void AppliesTo(uint32_t ssrc);
648
649 void WithBitrateBps(uint32_t bitrate_bps) {
650 remb_item_.BitRate = bitrate_bps;
651 }
652
653 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200654 bool Create(uint8_t* packet,
655 size_t* index,
656 size_t max_length,
657 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000658
659 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200660 static const int kMaxNumberOfSsrcs = 0xff;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000661
662 size_t BlockLength() const {
663 return (remb_item_.NumberOfSSRCs + 5) * 4;
664 }
665
666 RTCPUtility::RTCPPacketPSFBAPP remb_;
667 RTCPUtility::RTCPPacketPSFBREMBItem remb_item_;
668
henrikg3c089d72015-09-16 05:37:44 -0700669 RTC_DISALLOW_COPY_AND_ASSIGN(Remb);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000670};
671
672// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR).
673//
674// Format for XR packets:
675//
676// 0 1 2 3
677// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
678// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
679// |V=2|P|reserved | PT=XR=207 | length |
680// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
681// | SSRC |
682// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
683// : report blocks :
684// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
685
686class Xr : public RtcpPacket {
687 public:
688 typedef std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> DlrrBlock;
689 Xr() : RtcpPacket() {
690 memset(&xr_header_, 0, sizeof(xr_header_));
691 }
692
693 virtual ~Xr() {}
694
695 void From(uint32_t ssrc) {
696 xr_header_.OriginatorSSRC = ssrc;
697 }
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200698
699 // Max 50 items of each of {Rrtr, Dlrr, VoipMetric} allowed per Xr.
700 bool WithRrtr(Rrtr* rrtr);
701 bool WithDlrr(Dlrr* dlrr);
702 bool WithVoipMetric(VoipMetric* voip_metric);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000703
704 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200705 bool Create(uint8_t* packet,
706 size_t* index,
707 size_t max_length,
708 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000709
710 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200711 static const int kMaxNumberOfRrtrBlocks = 50;
712 static const int kMaxNumberOfDlrrBlocks = 50;
713 static const int kMaxNumberOfVoipMetricBlocks = 50;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000714
715 size_t BlockLength() const {
716 const size_t kXrHeaderLength = 8;
717 return kXrHeaderLength + RrtrLength() + DlrrLength() + VoipMetricLength();
718 }
719
720 size_t RrtrLength() const {
721 const size_t kRrtrBlockLength = 12;
722 return kRrtrBlockLength * rrtr_blocks_.size();
723 }
724
725 size_t DlrrLength() const;
726
727 size_t VoipMetricLength() const {
728 const size_t kVoipMetricBlockLength = 36;
729 return kVoipMetricBlockLength * voip_metric_blocks_.size();
730 }
731
732 RTCPUtility::RTCPPacketXR xr_header_;
733 std::vector<RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem> rrtr_blocks_;
734 std::vector<DlrrBlock> dlrr_blocks_;
735 std::vector<RTCPUtility::RTCPPacketXRVOIPMetricItem> voip_metric_blocks_;
736
henrikg3c089d72015-09-16 05:37:44 -0700737 RTC_DISALLOW_COPY_AND_ASSIGN(Xr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000738};
739
740// Receiver Reference Time Report Block (RFC 3611).
741//
742// 0 1 2 3
743// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
744// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
745// | BT=4 | reserved | block length = 2 |
746// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
747// | NTP timestamp, most significant word |
748// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
749// | NTP timestamp, least significant word |
750// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
751
752class Rrtr {
753 public:
754 Rrtr() {
755 memset(&rrtr_block_, 0, sizeof(rrtr_block_));
756 }
757 ~Rrtr() {}
758
759 void WithNtpSec(uint32_t sec) {
760 rrtr_block_.NTPMostSignificant = sec;
761 }
762 void WithNtpFrac(uint32_t frac) {
763 rrtr_block_.NTPLeastSignificant = frac;
764 }
765
766 private:
767 friend class Xr;
768 RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem rrtr_block_;
769
henrikg3c089d72015-09-16 05:37:44 -0700770 RTC_DISALLOW_COPY_AND_ASSIGN(Rrtr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000771};
772
773// DLRR Report Block (RFC 3611).
774//
775// 0 1 2 3
776// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
777// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
778// | BT=5 | reserved | block length |
779// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
780// | SSRC_1 (SSRC of first receiver) | sub-
781// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
782// | last RR (LRR) | 1
783// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
784// | delay since last RR (DLRR) |
785// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
786// | SSRC_2 (SSRC of second receiver) | sub-
787// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
788// : ... : 2
789
790class Dlrr {
791 public:
792 Dlrr() {}
793 ~Dlrr() {}
794
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200795 // Max 100 DLRR Items can be added per DLRR report block.
796 bool WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000797
798 private:
799 friend class Xr;
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200800 static const int kMaxNumberOfDlrrItems = 100;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000801
802 std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrr_block_;
803
henrikg3c089d72015-09-16 05:37:44 -0700804 RTC_DISALLOW_COPY_AND_ASSIGN(Dlrr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000805};
806
807// VoIP Metrics Report Block (RFC 3611).
808//
809// 0 1 2 3
810// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
811// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
812// | BT=7 | reserved | block length = 8 |
813// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
814// | SSRC of source |
815// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
816// | loss rate | discard rate | burst density | gap density |
817// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
818// | burst duration | gap duration |
819// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
820// | round trip delay | end system delay |
821// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
822// | signal level | noise level | RERL | Gmin |
823// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
824// | R factor | ext. R factor | MOS-LQ | MOS-CQ |
825// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
826// | RX config | reserved | JB nominal |
827// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
828// | JB maximum | JB abs max |
829// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
830
831class VoipMetric {
832 public:
833 VoipMetric() {
834 memset(&metric_, 0, sizeof(metric_));
835 }
836 ~VoipMetric() {}
837
838 void To(uint32_t ssrc) { metric_.SSRC = ssrc; }
839 void LossRate(uint8_t loss_rate) { metric_.lossRate = loss_rate; }
840 void DiscardRate(uint8_t discard_rate) { metric_.discardRate = discard_rate; }
841 void BurstDensity(uint8_t burst_density) {
842 metric_.burstDensity = burst_density;
843 }
844 void GapDensity(uint8_t gap_density) { metric_.gapDensity = gap_density; }
845 void BurstDuration(uint16_t burst_duration) {
846 metric_.burstDuration = burst_duration;
847 }
848 void GapDuration(uint16_t gap_duration) {
849 metric_.gapDuration = gap_duration;
850 }
851 void RoundTripDelay(uint16_t round_trip_delay) {
852 metric_.roundTripDelay = round_trip_delay;
853 }
854 void EndSystemDelay(uint16_t end_system_delay) {
855 metric_.endSystemDelay = end_system_delay;
856 }
857 void SignalLevel(uint8_t signal_level) { metric_.signalLevel = signal_level; }
858 void NoiseLevel(uint8_t noise_level) { metric_.noiseLevel = noise_level; }
859 void Rerl(uint8_t rerl) { metric_.RERL = rerl; }
860 void Gmin(uint8_t gmin) { metric_.Gmin = gmin; }
861 void Rfactor(uint8_t rfactor) { metric_.Rfactor = rfactor; }
862 void ExtRfactor(uint8_t extrfactor) { metric_.extRfactor = extrfactor; }
863 void MosLq(uint8_t moslq) { metric_.MOSLQ = moslq; }
864 void MosCq(uint8_t moscq) { metric_.MOSCQ = moscq; }
865 void RxConfig(uint8_t rxconfig) { metric_.RXconfig = rxconfig; }
866 void JbNominal(uint16_t jbnominal) { metric_.JBnominal = jbnominal; }
867 void JbMax(uint16_t jbmax) { metric_.JBmax = jbmax; }
868 void JbAbsMax(uint16_t jbabsmax) { metric_.JBabsMax = jbabsmax; }
869
870 private:
871 friend class Xr;
872 RTCPUtility::RTCPPacketXRVOIPMetricItem metric_;
873
henrikg3c089d72015-09-16 05:37:44 -0700874 RTC_DISALLOW_COPY_AND_ASSIGN(VoipMetric);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000875};
876
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000877// Class holding a RTCP packet.
878//
879// Takes a built rtcp packet.
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000880// RawPacket raw_packet(buffer, length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000881//
882// To access the raw packet:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200883// raw_packet.Buffer(); - pointer to the raw packet
884// raw_packet.BufferLength(); - the length of the raw packet
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000885
886class RawPacket {
887 public:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200888 explicit RawPacket(size_t buffer_length);
889 RawPacket(const uint8_t* packet, size_t packet_length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000890
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200891 const uint8_t* Buffer() const;
892 uint8_t* MutableBuffer();
893 size_t BufferLength() const;
894 size_t Length() const;
895 void SetLength(size_t length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000896
897 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200898 const size_t buffer_length_;
899 size_t length_;
900 rtc::scoped_ptr<uint8_t[]> buffer_;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000901};
902
903} // namespace rtcp
904} // namespace webrtc
905#endif // WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_