blob: 39c27289de3f68971b89e919e98d63e579df77f2 [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;
Erik Språngf7c57762015-12-04 10:40:35 +0100119 std::vector<RtcpPacket*> appended_packets_;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000120
121 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200122 bool CreateAndAddAppended(uint8_t* packet,
123 size_t* index,
124 size_t max_length,
125 PacketReadyCallback* callback) const;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000126};
127
Erik Språnga3b87692015-07-29 10:46:54 +0200128// TODO(sprang): Move RtcpPacket subclasses out to separate files.
129
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000130class Empty : public RtcpPacket {
131 public:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000132 Empty() : RtcpPacket() {}
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000133
134 virtual ~Empty() {}
135
136 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200137 bool Create(uint8_t* packet,
138 size_t* index,
139 size_t max_length,
140 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000141
Erik Språnga3b87692015-07-29 10:46:54 +0200142 size_t BlockLength() const override;
143
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000144 private:
henrikg3c089d72015-09-16 05:37:44 -0700145 RTC_DISALLOW_COPY_AND_ASSIGN(Empty);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000146};
147
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000148// RTCP sender report (RFC 3550).
149//
150// 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
151// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
152// |V=2|P| RC | PT=SR=200 | length |
153// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
154// | SSRC of sender |
155// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
156// | NTP timestamp, most significant word |
157// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
158// | NTP timestamp, least significant word |
159// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
160// | RTP timestamp |
161// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
162// | sender's packet count |
163// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
164// | sender's octet count |
165// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
166// | report block(s) |
167// | .... |
168
169class SenderReport : public RtcpPacket {
170 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000171 SenderReport() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000172 memset(&sr_, 0, sizeof(sr_));
173 }
174
175 virtual ~SenderReport() {}
176
177 void From(uint32_t ssrc) {
178 sr_.SenderSSRC = ssrc;
179 }
180 void WithNtpSec(uint32_t sec) {
181 sr_.NTPMostSignificant = sec;
182 }
183 void WithNtpFrac(uint32_t frac) {
184 sr_.NTPLeastSignificant = frac;
185 }
186 void WithRtpTimestamp(uint32_t rtp_timestamp) {
187 sr_.RTPTimestamp = rtp_timestamp;
188 }
189 void WithPacketCount(uint32_t packet_count) {
190 sr_.SenderPacketCount = packet_count;
191 }
192 void WithOctetCount(uint32_t octet_count) {
193 sr_.SenderOctetCount = octet_count;
194 }
Erik Språngbdc0b0d2015-06-22 15:21:24 +0200195 bool WithReportBlock(const ReportBlock& block);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000196
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000197 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200198 bool Create(uint8_t* packet,
199 size_t* index,
200 size_t max_length,
201 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000202
203 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200204 static const int kMaxNumberOfReportBlocks = 0x1f;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000205
206 size_t BlockLength() const {
207 const size_t kSrHeaderLength = 8;
208 const size_t kSenderInfoLength = 20;
209 return kSrHeaderLength + kSenderInfoLength +
210 report_blocks_.size() * kReportBlockLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000211 }
212
213 RTCPUtility::RTCPPacketSR sr_;
danilchapdf948f02015-11-13 03:03:13 -0800214 std::vector<ReportBlock> report_blocks_;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000215
henrikg3c089d72015-09-16 05:37:44 -0700216 RTC_DISALLOW_COPY_AND_ASSIGN(SenderReport);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000217};
218
219//
220// RTCP receiver report (RFC 3550).
221//
222// 0 1 2 3
223// 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
224// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
225// |V=2|P| RC | PT=RR=201 | length |
226// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
227// | SSRC of packet sender |
228// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
229// | report block(s) |
230// | .... |
231
232class ReceiverReport : public RtcpPacket {
233 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000234 ReceiverReport() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000235 memset(&rr_, 0, sizeof(rr_));
236 }
237
238 virtual ~ReceiverReport() {}
239
240 void From(uint32_t ssrc) {
241 rr_.SenderSSRC = ssrc;
242 }
Erik Språngbdc0b0d2015-06-22 15:21:24 +0200243 bool WithReportBlock(const ReportBlock& block);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000244
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000245 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200246 bool Create(uint8_t* packet,
247 size_t* index,
248 size_t max_length,
249 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000250
251 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200252 static const int kMaxNumberOfReportBlocks = 0x1F;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000253
254 size_t BlockLength() const {
255 const size_t kRrHeaderLength = 8;
256 return kRrHeaderLength + report_blocks_.size() * kReportBlockLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000257 }
258
259 RTCPUtility::RTCPPacketRR rr_;
danilchapdf948f02015-11-13 03:03:13 -0800260 std::vector<ReportBlock> report_blocks_;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000261
henrikg3c089d72015-09-16 05:37:44 -0700262 RTC_DISALLOW_COPY_AND_ASSIGN(ReceiverReport);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000263};
264
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000265// Source Description (SDES) (RFC 3550).
266//
267// 0 1 2 3
268// 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
269// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
270// header |V=2|P| SC | PT=SDES=202 | length |
271// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
272// chunk | SSRC/CSRC_1 |
273// 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
274// | SDES items |
275// | ... |
276// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
277// chunk | SSRC/CSRC_2 |
278// 2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
279// | SDES items |
280// | ... |
281// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
282//
283// Canonical End-Point Identifier SDES Item (CNAME)
284//
285// 0 1 2 3
286// 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
287// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
288// | CNAME=1 | length | user and domain name ...
289// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
290
291class Sdes : public RtcpPacket {
292 public:
293 Sdes() : RtcpPacket() {}
294
295 virtual ~Sdes() {}
296
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200297 bool WithCName(uint32_t ssrc, const std::string& cname);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000298
299 struct Chunk {
300 uint32_t ssrc;
301 std::string name;
302 int null_octets;
303 };
304
305 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200306 bool Create(uint8_t* packet,
307 size_t* index,
308 size_t max_length,
309 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000310
311 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200312 static const int kMaxNumberOfChunks = 0x1f;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000313
314 size_t BlockLength() const;
315
316 std::vector<Chunk> chunks_;
317
henrikg3c089d72015-09-16 05:37:44 -0700318 RTC_DISALLOW_COPY_AND_ASSIGN(Sdes);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000319};
320
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000321// Slice loss indication (SLI) (RFC 4585).
322//
323// FCI:
324// 0 1 2 3
325// 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
326// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
327// | First | Number | PictureID |
328// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
329
330class Sli : public RtcpPacket {
331 public:
332 Sli() : RtcpPacket() {
333 memset(&sli_, 0, sizeof(sli_));
334 memset(&sli_item_, 0, sizeof(sli_item_));
335 }
336
337 virtual ~Sli() {}
338
339 void From(uint32_t ssrc) {
340 sli_.SenderSSRC = ssrc;
341 }
342 void To(uint32_t ssrc) {
343 sli_.MediaSSRC = ssrc;
344 }
345 void WithFirstMb(uint16_t first_mb) {
346 assert(first_mb <= 0x1fff);
347 sli_item_.FirstMB = first_mb;
348 }
349 void WithNumberOfMb(uint16_t number_mb) {
350 assert(number_mb <= 0x1fff);
351 sli_item_.NumberOfMB = number_mb;
352 }
353 void WithPictureId(uint8_t picture_id) {
354 assert(picture_id <= 0x3f);
355 sli_item_.PictureId = picture_id;
356 }
357
358 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200359 bool Create(uint8_t* packet,
360 size_t* index,
361 size_t max_length,
362 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000363
364 private:
365 size_t BlockLength() const {
366 const size_t kFciLength = 4;
367 return kCommonFbFmtLength + kFciLength;
368 }
369
370 RTCPUtility::RTCPPacketPSFBSLI sli_;
371 RTCPUtility::RTCPPacketPSFBSLIItem sli_item_;
372
henrikg3c089d72015-09-16 05:37:44 -0700373 RTC_DISALLOW_COPY_AND_ASSIGN(Sli);
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000374};
375
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000376// Generic NACK (RFC 4585).
377//
378// FCI:
379// 0 1 2 3
380// 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
381// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
382// | PID | BLP |
383// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
384
385class Nack : public RtcpPacket {
386 public:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000387 Nack() : RtcpPacket() {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000388 memset(&nack_, 0, sizeof(nack_));
389 }
390
391 virtual ~Nack() {}
392
393 void From(uint32_t ssrc) {
394 nack_.SenderSSRC = ssrc;
395 }
396 void To(uint32_t ssrc) {
397 nack_.MediaSSRC = ssrc;
398 }
399 void WithList(const uint16_t* nack_list, int length);
400
401 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200402 bool Create(uint8_t* packet,
403 size_t* index,
404 size_t max_length,
405 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000406
Erik Språnga3b87692015-07-29 10:46:54 +0200407 size_t BlockLength() const override;
408
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000409 private:
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000410
411 RTCPUtility::RTCPPacketRTPFBNACK nack_;
412 std::vector<RTCPUtility::RTCPPacketRTPFBNACKItem> nack_fields_;
413
henrikg3c089d72015-09-16 05:37:44 -0700414 RTC_DISALLOW_COPY_AND_ASSIGN(Nack);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000415};
416
417// Reference picture selection indication (RPSI) (RFC 4585).
418//
419// FCI:
420//
421// 0 1 2 3
422// 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
423// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
424// | PB |0| Payload Type| Native RPSI bit string |
425// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
426// | defined per codec ... | Padding (0) |
427// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
428
429class Rpsi : public RtcpPacket {
430 public:
431 Rpsi()
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000432 : RtcpPacket(),
433 padding_bytes_(0) {
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000434 memset(&rpsi_, 0, sizeof(rpsi_));
435 }
436
437 virtual ~Rpsi() {}
438
439 void From(uint32_t ssrc) {
440 rpsi_.SenderSSRC = ssrc;
441 }
442 void To(uint32_t ssrc) {
443 rpsi_.MediaSSRC = ssrc;
444 }
445 void WithPayloadType(uint8_t payload) {
446 assert(payload <= 0x7f);
447 rpsi_.PayloadType = payload;
448 }
449 void WithPictureId(uint64_t picture_id);
450
451 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200452 bool Create(uint8_t* packet,
453 size_t* index,
454 size_t max_length,
455 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000456
457 private:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000458 size_t BlockLength() const {
459 size_t fci_length = 2 + (rpsi_.NumberOfValidBits / 8) + padding_bytes_;
460 return kCommonFbFmtLength + fci_length;
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000461 }
462
463 uint8_t padding_bytes_;
464 RTCPUtility::RTCPPacketPSFBRPSI rpsi_;
465
henrikg3c089d72015-09-16 05:37:44 -0700466 RTC_DISALLOW_COPY_AND_ASSIGN(Rpsi);
asapersson@webrtc.orga8260062014-05-20 09:53:51 +0000467};
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000468
469// Full intra request (FIR) (RFC 5104).
470//
471// FCI:
472//
473// 0 1 2 3
474// 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
475// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
476// | SSRC |
477// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
478// | Seq nr. | Reserved |
479// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
480
481class Fir : public RtcpPacket {
482 public:
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000483 Fir() : RtcpPacket() {
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000484 memset(&fir_, 0, sizeof(fir_));
485 memset(&fir_item_, 0, sizeof(fir_item_));
486 }
487
488 virtual ~Fir() {}
489
490 void From(uint32_t ssrc) {
491 fir_.SenderSSRC = ssrc;
492 }
493 void To(uint32_t ssrc) {
494 fir_item_.SSRC = ssrc;
495 }
496 void WithCommandSeqNum(uint8_t seq_num) {
497 fir_item_.CommandSequenceNumber = seq_num;
498 }
499
500 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200501 bool Create(uint8_t* packet,
502 size_t* index,
503 size_t max_length,
504 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000505
506 private:
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000507 size_t BlockLength() const {
508 const size_t kFciLength = 8;
509 return kCommonFbFmtLength + kFciLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000510 }
511
512 RTCPUtility::RTCPPacketPSFBFIR fir_;
513 RTCPUtility::RTCPPacketPSFBFIRItem fir_item_;
514};
515
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000516// Temporary Maximum Media Stream Bit Rate Request (TMMBR) (RFC 5104).
517//
518// FCI:
519//
520// 0 1 2 3
521// 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
522// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
523// | SSRC |
524// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
525// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
526// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
527
528class Tmmbr : public RtcpPacket {
529 public:
530 Tmmbr() : RtcpPacket() {
531 memset(&tmmbr_, 0, sizeof(tmmbr_));
532 memset(&tmmbr_item_, 0, sizeof(tmmbr_item_));
533 }
534
535 virtual ~Tmmbr() {}
536
537 void From(uint32_t ssrc) {
538 tmmbr_.SenderSSRC = ssrc;
539 }
540 void To(uint32_t ssrc) {
541 tmmbr_item_.SSRC = ssrc;
542 }
543 void WithBitrateKbps(uint32_t bitrate_kbps) {
544 tmmbr_item_.MaxTotalMediaBitRate = bitrate_kbps;
545 }
546 void WithOverhead(uint16_t overhead) {
547 assert(overhead <= 0x1ff);
548 tmmbr_item_.MeasuredOverhead = overhead;
549 }
550
551 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200552 bool Create(uint8_t* packet,
553 size_t* index,
554 size_t max_length,
555 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000556
557 private:
558 size_t BlockLength() const {
559 const size_t kFciLen = 8;
560 return kCommonFbFmtLength + kFciLen;
561 }
562
563 RTCPUtility::RTCPPacketRTPFBTMMBR tmmbr_;
564 RTCPUtility::RTCPPacketRTPFBTMMBRItem tmmbr_item_;
565
henrikg3c089d72015-09-16 05:37:44 -0700566 RTC_DISALLOW_COPY_AND_ASSIGN(Tmmbr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000567};
568
569// Temporary Maximum Media Stream Bit Rate Notification (TMMBN) (RFC 5104).
570//
571// FCI:
572//
573// 0 1 2 3
574// 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
575// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
576// | SSRC |
577// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
578// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
579// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
580
581class Tmmbn : public RtcpPacket {
582 public:
583 Tmmbn() : RtcpPacket() {
584 memset(&tmmbn_, 0, sizeof(tmmbn_));
585 }
586
587 virtual ~Tmmbn() {}
588
589 void From(uint32_t ssrc) {
590 tmmbn_.SenderSSRC = ssrc;
591 }
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200592 // Max 50 TMMBR can be added per TMMBN.
593 bool WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000594
595 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200596 bool Create(uint8_t* packet,
597 size_t* index,
598 size_t max_length,
599 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000600
601 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200602 static const int kMaxNumberOfTmmbrs = 50;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000603
604 size_t BlockLength() const {
605 const size_t kFciLen = 8;
606 return kCommonFbFmtLength + kFciLen * tmmbn_items_.size();
607 }
608
609 RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_;
610 std::vector<RTCPUtility::RTCPPacketRTPFBTMMBRItem> tmmbn_items_;
611
henrikg3c089d72015-09-16 05:37:44 -0700612 RTC_DISALLOW_COPY_AND_ASSIGN(Tmmbn);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000613};
614
615// Receiver Estimated Max Bitrate (REMB) (draft-alvestrand-rmcat-remb).
616//
617// 0 1 2 3
618// 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
619// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
620// |V=2|P| FMT=15 | PT=206 | length |
621// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
622// | SSRC of packet sender |
623// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
624// | SSRC of media source |
625// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
626// | Unique identifier 'R' 'E' 'M' 'B' |
627// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
628// | Num SSRC | BR Exp | BR Mantissa |
629// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
630// | SSRC feedback |
631// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
632// | ...
633
634class Remb : public RtcpPacket {
635 public:
636 Remb() : RtcpPacket() {
637 memset(&remb_, 0, sizeof(remb_));
638 memset(&remb_item_, 0, sizeof(remb_item_));
639 }
640
641 virtual ~Remb() {}
642
643 void From(uint32_t ssrc) {
644 remb_.SenderSSRC = ssrc;
645 }
646 void AppliesTo(uint32_t ssrc);
647
648 void WithBitrateBps(uint32_t bitrate_bps) {
649 remb_item_.BitRate = bitrate_bps;
650 }
651
652 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200653 bool Create(uint8_t* packet,
654 size_t* index,
655 size_t max_length,
656 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000657
658 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200659 static const int kMaxNumberOfSsrcs = 0xff;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000660
661 size_t BlockLength() const {
662 return (remb_item_.NumberOfSSRCs + 5) * 4;
663 }
664
665 RTCPUtility::RTCPPacketPSFBAPP remb_;
666 RTCPUtility::RTCPPacketPSFBREMBItem remb_item_;
667
henrikg3c089d72015-09-16 05:37:44 -0700668 RTC_DISALLOW_COPY_AND_ASSIGN(Remb);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000669};
670
671// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR).
672//
673// Format for XR packets:
674//
675// 0 1 2 3
676// 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
677// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
678// |V=2|P|reserved | PT=XR=207 | length |
679// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
680// | SSRC |
681// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
682// : report blocks :
683// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
684
685class Xr : public RtcpPacket {
686 public:
687 typedef std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> DlrrBlock;
688 Xr() : RtcpPacket() {
689 memset(&xr_header_, 0, sizeof(xr_header_));
690 }
691
692 virtual ~Xr() {}
693
694 void From(uint32_t ssrc) {
695 xr_header_.OriginatorSSRC = ssrc;
696 }
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200697
698 // Max 50 items of each of {Rrtr, Dlrr, VoipMetric} allowed per Xr.
699 bool WithRrtr(Rrtr* rrtr);
700 bool WithDlrr(Dlrr* dlrr);
701 bool WithVoipMetric(VoipMetric* voip_metric);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000702
703 protected:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200704 bool Create(uint8_t* packet,
705 size_t* index,
706 size_t max_length,
707 RtcpPacket::PacketReadyCallback* callback) const override;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000708
709 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200710 static const int kMaxNumberOfRrtrBlocks = 50;
711 static const int kMaxNumberOfDlrrBlocks = 50;
712 static const int kMaxNumberOfVoipMetricBlocks = 50;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000713
714 size_t BlockLength() const {
715 const size_t kXrHeaderLength = 8;
716 return kXrHeaderLength + RrtrLength() + DlrrLength() + VoipMetricLength();
717 }
718
719 size_t RrtrLength() const {
720 const size_t kRrtrBlockLength = 12;
721 return kRrtrBlockLength * rrtr_blocks_.size();
722 }
723
724 size_t DlrrLength() const;
725
726 size_t VoipMetricLength() const {
727 const size_t kVoipMetricBlockLength = 36;
728 return kVoipMetricBlockLength * voip_metric_blocks_.size();
729 }
730
731 RTCPUtility::RTCPPacketXR xr_header_;
732 std::vector<RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem> rrtr_blocks_;
733 std::vector<DlrrBlock> dlrr_blocks_;
734 std::vector<RTCPUtility::RTCPPacketXRVOIPMetricItem> voip_metric_blocks_;
735
henrikg3c089d72015-09-16 05:37:44 -0700736 RTC_DISALLOW_COPY_AND_ASSIGN(Xr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000737};
738
739// Receiver Reference Time Report Block (RFC 3611).
740//
741// 0 1 2 3
742// 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
743// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
744// | BT=4 | reserved | block length = 2 |
745// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
746// | NTP timestamp, most significant word |
747// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
748// | NTP timestamp, least significant word |
749// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
750
751class Rrtr {
752 public:
753 Rrtr() {
754 memset(&rrtr_block_, 0, sizeof(rrtr_block_));
755 }
756 ~Rrtr() {}
757
758 void WithNtpSec(uint32_t sec) {
759 rrtr_block_.NTPMostSignificant = sec;
760 }
761 void WithNtpFrac(uint32_t frac) {
762 rrtr_block_.NTPLeastSignificant = frac;
763 }
764
765 private:
766 friend class Xr;
767 RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem rrtr_block_;
768
henrikg3c089d72015-09-16 05:37:44 -0700769 RTC_DISALLOW_COPY_AND_ASSIGN(Rrtr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000770};
771
772// DLRR Report Block (RFC 3611).
773//
774// 0 1 2 3
775// 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
776// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
777// | BT=5 | reserved | block length |
778// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
779// | SSRC_1 (SSRC of first receiver) | sub-
780// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
781// | last RR (LRR) | 1
782// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
783// | delay since last RR (DLRR) |
784// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
785// | SSRC_2 (SSRC of second receiver) | sub-
786// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
787// : ... : 2
788
789class Dlrr {
790 public:
791 Dlrr() {}
792 ~Dlrr() {}
793
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200794 // Max 100 DLRR Items can be added per DLRR report block.
795 bool WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000796
797 private:
798 friend class Xr;
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200799 static const int kMaxNumberOfDlrrItems = 100;
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000800
801 std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrr_block_;
802
henrikg3c089d72015-09-16 05:37:44 -0700803 RTC_DISALLOW_COPY_AND_ASSIGN(Dlrr);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000804};
805
806// VoIP Metrics Report Block (RFC 3611).
807//
808// 0 1 2 3
809// 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
810// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
811// | BT=7 | reserved | block length = 8 |
812// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
813// | SSRC of source |
814// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
815// | loss rate | discard rate | burst density | gap density |
816// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
817// | burst duration | gap duration |
818// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
819// | round trip delay | end system delay |
820// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
821// | signal level | noise level | RERL | Gmin |
822// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
823// | R factor | ext. R factor | MOS-LQ | MOS-CQ |
824// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
825// | RX config | reserved | JB nominal |
826// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
827// | JB maximum | JB abs max |
828// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
829
830class VoipMetric {
831 public:
832 VoipMetric() {
833 memset(&metric_, 0, sizeof(metric_));
834 }
835 ~VoipMetric() {}
836
837 void To(uint32_t ssrc) { metric_.SSRC = ssrc; }
838 void LossRate(uint8_t loss_rate) { metric_.lossRate = loss_rate; }
839 void DiscardRate(uint8_t discard_rate) { metric_.discardRate = discard_rate; }
840 void BurstDensity(uint8_t burst_density) {
841 metric_.burstDensity = burst_density;
842 }
843 void GapDensity(uint8_t gap_density) { metric_.gapDensity = gap_density; }
844 void BurstDuration(uint16_t burst_duration) {
845 metric_.burstDuration = burst_duration;
846 }
847 void GapDuration(uint16_t gap_duration) {
848 metric_.gapDuration = gap_duration;
849 }
850 void RoundTripDelay(uint16_t round_trip_delay) {
851 metric_.roundTripDelay = round_trip_delay;
852 }
853 void EndSystemDelay(uint16_t end_system_delay) {
854 metric_.endSystemDelay = end_system_delay;
855 }
856 void SignalLevel(uint8_t signal_level) { metric_.signalLevel = signal_level; }
857 void NoiseLevel(uint8_t noise_level) { metric_.noiseLevel = noise_level; }
858 void Rerl(uint8_t rerl) { metric_.RERL = rerl; }
859 void Gmin(uint8_t gmin) { metric_.Gmin = gmin; }
860 void Rfactor(uint8_t rfactor) { metric_.Rfactor = rfactor; }
861 void ExtRfactor(uint8_t extrfactor) { metric_.extRfactor = extrfactor; }
862 void MosLq(uint8_t moslq) { metric_.MOSLQ = moslq; }
863 void MosCq(uint8_t moscq) { metric_.MOSCQ = moscq; }
864 void RxConfig(uint8_t rxconfig) { metric_.RXconfig = rxconfig; }
865 void JbNominal(uint16_t jbnominal) { metric_.JBnominal = jbnominal; }
866 void JbMax(uint16_t jbmax) { metric_.JBmax = jbmax; }
867 void JbAbsMax(uint16_t jbabsmax) { metric_.JBabsMax = jbabsmax; }
868
869 private:
870 friend class Xr;
871 RTCPUtility::RTCPPacketXRVOIPMetricItem metric_;
872
henrikg3c089d72015-09-16 05:37:44 -0700873 RTC_DISALLOW_COPY_AND_ASSIGN(VoipMetric);
asapersson@webrtc.org3b84b3a2014-06-25 12:22:17 +0000874};
875
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000876// Class holding a RTCP packet.
877//
878// Takes a built rtcp packet.
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +0000879// RawPacket raw_packet(buffer, length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000880//
881// To access the raw packet:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200882// raw_packet.Buffer(); - pointer to the raw packet
883// raw_packet.BufferLength(); - the length of the raw packet
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000884
885class RawPacket {
886 public:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200887 explicit RawPacket(size_t buffer_length);
888 RawPacket(const uint8_t* packet, size_t packet_length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000889
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200890 const uint8_t* Buffer() const;
891 uint8_t* MutableBuffer();
892 size_t BufferLength() const;
893 size_t Length() const;
894 void SetLength(size_t length);
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000895
896 private:
Erik Språngc1b9d4e2015-06-08 09:54:14 +0200897 const size_t buffer_length_;
898 size_t length_;
899 rtc::scoped_ptr<uint8_t[]> buffer_;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +0000900};
901
902} // namespace rtcp
903} // namespace webrtc
904#endif // WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_