1663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org/*
2663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *
4663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  Use of this source code is governed by a BSD-style license
5663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  that can be found in the LICENSE file in the root of the source
6663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  tree. An additional intellectual property rights grant can be found
7663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  in the file PATENTS.  All contributing project authors may
8663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org *
10663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org */
11663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
12663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#ifndef WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_
13663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#define WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_
14663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
15847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org#include <map>
16847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org#include <string>
17663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#include <vector>
18663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
19663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
20663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
21663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#include "webrtc/typedefs.h"
22663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
23663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgnamespace webrtc {
24663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgnamespace rtcp {
25663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
26847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgenum { kCommonFbFmtLength = 12 };
27847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgenum { kReportBlockLength = 24 };
28847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
297eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Dlrr;
30663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass RawPacket;
317eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Rrtr;
327eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass VoipMetric;
33663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
34663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Class for building RTCP packets.
35663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
36663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  Example:
37663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  ReportBlock report_block;
38663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  report_block.To(234)
39663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  report_block.FractionLost(10);
40663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
41663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  ReceiverReport rr;
42663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  rr.From(123);
43663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  rr.WithReportBlock(&report_block)
44663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
45663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  Fir fir;
46663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  fir.From(123);
47663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  fir.To(234)
48663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  fir.WithCommandSeqNum(123);
49663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
50847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  size_t length = 0;                     // Builds an intra frame request
51663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  uint8_t packet[kPacketSize];           // with sequence number 123.
52847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  fir.Build(packet, &length, kPacketSize);
53663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
54663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  RawPacket packet = fir.Build();        // Returns a RawPacket holding
55663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//                                         // the built rtcp packet.
56663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
57663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  rr.Append(&fir)                        // Builds a compound RTCP packet with
58663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  RawPacket packet = rr.Build();         // a receiver report, report block
59663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//                                         // and fir message.
60663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
61663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass RtcpPacket {
62663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
63663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~RtcpPacket() {}
64663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
65663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void Append(RtcpPacket* packet);
66663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
67663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RawPacket Build() const;
68663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
69847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void Build(uint8_t* packet, size_t* length, size_t max_length) const;
70663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
71663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
72847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RtcpPacket() : kHeaderLength(4) {}
73663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
74663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual void Create(
75847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const = 0;
76663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
77847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  const size_t kHeaderLength;
78663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
79663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
80847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void CreateAndAddAppended(
81847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const;
82847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
83663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  std::vector<RtcpPacket*> appended_packets_;
84663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
85663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
86663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass Empty : public RtcpPacket {
87663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
887eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Empty() : RtcpPacket() {}
89663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
90663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~Empty() {}
91663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
92663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
937eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual void Create(
947eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
957eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
967eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
977eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Empty);
98663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
99663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
100847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
101663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
102847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// RTCP report block (RFC 3550).
103847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
104847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   0                   1                   2                   3
105847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   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
106847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
107847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                 SSRC_1 (SSRC of first source)                 |
108847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  | fraction lost |       cumulative number of packets lost       |
110847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
111847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |           extended highest sequence number received           |
112847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
113847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                      interarrival jitter                      |
114847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
115847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                         last SR (LSR)                         |
116847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
117847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                   delay since last SR (DLSR)                  |
118847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
119847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
120847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass ReportBlock {
121847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org public:
122847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  ReportBlock() {
123847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    // TODO(asapersson): Consider adding a constructor to struct.
124847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memset(&report_block_, 0, sizeof(report_block_));
125847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
126847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
127847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  ~ReportBlock() {}
128847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
129847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void To(uint32_t ssrc) {
130847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.SSRC = ssrc;
131847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
132847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithFractionLost(uint8_t fraction_lost) {
133847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.FractionLost = fraction_lost;
134847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
135847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithCumulativeLost(uint32_t cumulative_lost) {
136847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.CumulativeNumOfPacketsLost = cumulative_lost;
137847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
138847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithExtHighestSeqNum(uint32_t ext_highest_seq_num) {
139847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.ExtendedHighestSequenceNumber = ext_highest_seq_num;
140847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
141847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithJitter(uint32_t jitter) {
142847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.Jitter = jitter;
143847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
144847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithLastSr(uint32_t last_sr) {
145847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.LastSR = last_sr;
146847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
147847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithDelayLastSr(uint32_t delay_last_sr) {
148847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    report_block_.DelayLastSR = delay_last_sr;
149847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
150847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
151847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org private:
152847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  friend class SenderReport;
153847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  friend class ReceiverReport;
154847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RTCPUtility::RTCPPacketReportBlockItem report_block_;
155847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org};
156847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
157663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// RTCP sender report (RFC 3550).
158663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
159663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   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
160663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |V=2|P|    RC   |   PT=SR=200   |             length            |
162663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
163663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                         SSRC of sender                        |
164663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
165663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |              NTP timestamp, most significant word             |
166663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
167663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |             NTP timestamp, least significant word             |
168663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
169663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                         RTP timestamp                         |
170663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
171663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                     sender's packet count                     |
172663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
173663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                      sender's octet count                     |
174663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
175663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                         report block(s)                       |
176663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                            ....                               |
177663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
178663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass SenderReport : public RtcpPacket {
179663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
180847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  SenderReport() : RtcpPacket() {
181663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    memset(&sr_, 0, sizeof(sr_));
182663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
183663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
184663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~SenderReport() {}
185663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
186663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void From(uint32_t ssrc) {
187663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.SenderSSRC = ssrc;
188663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
189663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithNtpSec(uint32_t sec) {
190663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.NTPMostSignificant = sec;
191663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
192663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithNtpFrac(uint32_t frac) {
193663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.NTPLeastSignificant = frac;
194663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
195663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithRtpTimestamp(uint32_t rtp_timestamp) {
196663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.RTPTimestamp = rtp_timestamp;
197663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
198663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithPacketCount(uint32_t packet_count) {
199663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.SenderPacketCount = packet_count;
200663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
201663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithOctetCount(uint32_t octet_count) {
202663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    sr_.SenderOctetCount = octet_count;
203663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
204663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithReportBlock(ReportBlock* block);
205663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
206663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
207847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
208847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
209663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
210663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
211847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  enum { kMaxNumberOfReportBlocks = 0x1f };
212847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
213847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
214847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    const size_t kSrHeaderLength = 8;
215847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    const size_t kSenderInfoLength = 20;
216847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kSrHeaderLength + kSenderInfoLength +
217847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org           report_blocks_.size() * kReportBlockLength;
218663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
219663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
220663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RTCPUtility::RTCPPacketSR sr_;
221847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketReportBlockItem> report_blocks_;
2227eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
2237eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(SenderReport);
224663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
225663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
226663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
227663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// RTCP receiver report (RFC 3550).
228663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
229663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   0                   1                   2                   3
230663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   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
231663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
232663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |V=2|P|    RC   |   PT=RR=201   |             length            |
233663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
234663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                     SSRC of packet sender                     |
235663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
236663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                         report block(s)                       |
237663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  |                            ....                               |
238663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
239663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass ReceiverReport : public RtcpPacket {
240663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
241847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  ReceiverReport() : RtcpPacket() {
242663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    memset(&rr_, 0, sizeof(rr_));
243663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
244663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
245663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~ReceiverReport() {}
246663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
247663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void From(uint32_t ssrc) {
248663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    rr_.SenderSSRC = ssrc;
249663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
250663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithReportBlock(ReportBlock* block);
251663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
252663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
253847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
254847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
255663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
256663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
257847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  enum { kMaxNumberOfReportBlocks = 0x1f };
258847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
259847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
260847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    const size_t kRrHeaderLength = 8;
261847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kRrHeaderLength + report_blocks_.size() * kReportBlockLength;
262663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
263663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
264663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RTCPUtility::RTCPPacketRR rr_;
265847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketReportBlockItem> report_blocks_;
2667eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
2677eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(ReceiverReport);
268663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
269663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
270847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Transmission Time Offsets in RTP Streams (RFC 5450).
271663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
272847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//      0                   1                   2                   3
273847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//      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
274847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
275847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// hdr |V=2|P|    RC   |   PT=IJ=195   |             length            |
276847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
277847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     |                      inter-arrival jitter                     |
278847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
279847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     .                                                               .
280847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     .                                                               .
281847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     .                                                               .
282847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     |                      inter-arrival jitter                     |
283847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
284663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
285847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  If present, this RTCP packet must be placed after a receiver report
286847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  (inside a compound RTCP packet), and MUST have the same value for RC
287847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  (reception report count) as the receiver report.
288663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
289847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass Ij : public RtcpPacket {
290663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
291847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Ij() : RtcpPacket() {}
292663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
293847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual ~Ij() {}
294663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
295847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithJitterItem(uint32_t jitter);
296847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
297847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org protected:
298847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
299847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
300847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
301847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org private:
302847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  enum { kMaxNumberOfIjItems = 0x1f };
303847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
304847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
305847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kHeaderLength + 4 * ij_items_.size();
306663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
307663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
308847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  std::vector<uint32_t> ij_items_;
309847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
310847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Ij);
311847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org};
312847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
313847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Source Description (SDES) (RFC 3550).
314847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
315847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//         0                   1                   2                   3
316847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//         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
317847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
318847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// header |V=2|P|    SC   |  PT=SDES=202  |             length            |
319847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
320847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// chunk  |                          SSRC/CSRC_1                          |
321847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
322847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        |                           SDES items                          |
323847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        |                              ...                              |
324847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
325847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// chunk  |                          SSRC/CSRC_2                          |
326847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   2    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
327847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        |                           SDES items                          |
328847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        |                              ...                              |
329847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
330847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
331847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Canonical End-Point Identifier SDES Item (CNAME)
332847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
333847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//    0                   1                   2                   3
334847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//    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
335847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
336847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   |    CNAME=1    |     length    | user and domain name        ...
337847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
338847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
339847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass Sdes : public RtcpPacket {
340847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org public:
341847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Sdes() : RtcpPacket() {}
342847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
343847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual ~Sdes() {}
344847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
345847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithCName(uint32_t ssrc, std::string cname);
346847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
347847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  struct Chunk {
348847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    uint32_t ssrc;
349847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    std::string name;
350847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    int null_octets;
351847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  };
352847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
353847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org protected:
354847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
355847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
356663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
357663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
358847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  enum { kMaxNumberOfChunks = 0x1f };
359847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
360847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const;
361847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
362847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  std::vector<Chunk> chunks_;
363847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
364847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Sdes);
365663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
366663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
367663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
368663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Bye packet (BYE) (RFC 3550).
369663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
370663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//        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
371663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
372663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       |V=2|P|    SC   |   PT=BYE=203  |             length            |
373663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
374663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       |                           SSRC/CSRC                           |
375663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
376663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       :                              ...                              :
377663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
378663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// (opt) |     length    |               reason for leaving            ...
379663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
380663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
381663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass Bye : public RtcpPacket {
382663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
383847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Bye() : RtcpPacket() {
384663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    memset(&bye_, 0, sizeof(bye_));
385663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
386663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
387663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~Bye() {}
388663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
389663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void From(uint32_t ssrc) {
390663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    bye_.SenderSSRC = ssrc;
391663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
392663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithCsrc(uint32_t csrc);
393663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
394663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
395847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
396847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
397663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
398663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
399847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  enum { kMaxNumberOfCsrcs = 0x1f - 1 };
400847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
401847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
402847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    size_t source_count = 1 + csrcs_.size();
403847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kHeaderLength + 4 * source_count;
404663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
405663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
406663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RTCPUtility::RTCPPacketBYE bye_;
407663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  std::vector<uint32_t> csrcs_;
4087eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
4097eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Bye);
410663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
411663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
412847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Application-Defined packet (APP) (RFC 3550).
413847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
414847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   0                   1                   2                   3
415847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   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
416847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
417847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |V=2|P| subtype |   PT=APP=204  |             length            |
418847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
419847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                           SSRC/CSRC                           |
420847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
421847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                          name (ASCII)                         |
422847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
423847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  |                   application-dependent data                ...
424847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
425847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
426847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass App : public RtcpPacket {
427847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org public:
428847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  App()
429847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      : RtcpPacket(),
430847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org        ssrc_(0) {
431847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memset(&app_, 0, sizeof(app_));
432847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
433847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
434847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual ~App() {}
435847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
436847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void From(uint32_t ssrc) {
437847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    ssrc_ = ssrc;
438847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
439847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithSubType(uint8_t subtype) {
440847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(subtype <= 0x1f);
441847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    app_.SubType = subtype;
442847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
443847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithName(uint32_t name) {
444847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    app_.Name = name;
445847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
446847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithData(const uint8_t* data, uint16_t data_length) {
447847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(data);
448847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(data_length <= kRtcpAppCode_DATA_SIZE);
449847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(data_length % 4 == 0);
450847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memcpy(app_.Data, data, data_length);
451847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    app_.Size = data_length;
452847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
453847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
454847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org protected:
455847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
456847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
457847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
458847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org private:
459847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
460847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return 12 + app_.Size;
461847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
462847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
463847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  uint32_t ssrc_;
464847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RTCPUtility::RTCPPacketAPP app_;
465847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
466847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(App);
467847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org};
468847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
469663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// RFC 4585: Feedback format.
470663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
471663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Common packet format:
472663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
473663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//    0                   1                   2                   3
474663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//    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
475663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
476663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   |V=2|P|   FMT   |       PT      |          length               |
477663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
478663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   |                  SSRC of packet sender                        |
479663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
480663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   |                  SSRC of media source                         |
481663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
482663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   :            Feedback Control Information (FCI)                 :
483663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   :
484663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
485847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Picture loss indication (PLI) (RFC 4585).
486847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
487847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// FCI: no feedback control information.
488847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
489847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass Pli : public RtcpPacket {
490847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org public:
491847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Pli() : RtcpPacket() {
492847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memset(&pli_, 0, sizeof(pli_));
493847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
494847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
495847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual ~Pli() {}
496847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
497847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void From(uint32_t ssrc) {
498847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    pli_.SenderSSRC = ssrc;
499847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
500847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void To(uint32_t ssrc) {
501847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    pli_.MediaSSRC = ssrc;
502847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
503847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
504847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org protected:
505847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
506847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
507847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
508847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org private:
509847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
510847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kCommonFbFmtLength;
511847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
512847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
513847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBPLI pli_;
514847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
515847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Pli);
516847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org};
517847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
518847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// Slice loss indication (SLI) (RFC 4585).
519847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//
520847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org// FCI:
521847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//    0                   1                   2                   3
522847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//    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
523847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
524847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   |            First        |        Number           | PictureID |
525847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
526847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
527847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.orgclass Sli : public RtcpPacket {
528847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org public:
529847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Sli() : RtcpPacket() {
530847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memset(&sli_, 0, sizeof(sli_));
531847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memset(&sli_item_, 0, sizeof(sli_item_));
532847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
533847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
534847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual ~Sli() {}
535847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
536847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void From(uint32_t ssrc) {
537847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    sli_.SenderSSRC = ssrc;
538847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
539847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void To(uint32_t ssrc) {
540847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    sli_.MediaSSRC = ssrc;
541847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
542847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithFirstMb(uint16_t first_mb) {
543847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(first_mb <= 0x1fff);
544847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    sli_item_.FirstMB = first_mb;
545847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
546847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithNumberOfMb(uint16_t number_mb) {
547847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(number_mb <= 0x1fff);
548847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    sli_item_.NumberOfMB = number_mb;
549847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
550847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  void WithPictureId(uint8_t picture_id) {
551847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(picture_id <= 0x3f);
552847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    sli_item_.PictureId = picture_id;
553847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
554847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
555847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org protected:
556847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
557847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
558847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
559847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org private:
560847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
561847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    const size_t kFciLength = 4;
562847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kCommonFbFmtLength + kFciLength;
563847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  }
564847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
565847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBSLI sli_;
566847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBSLIItem sli_item_;
567847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
568847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Sli);
569847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org};
570847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org
571b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org// Generic NACK (RFC 4585).
572b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//
573b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org// FCI:
574b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//    0                   1                   2                   3
575b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//    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
576b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
577b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   |            PID                |             BLP               |
578b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
579b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
580b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.orgclass Nack : public RtcpPacket {
581b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org public:
582847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  Nack() : RtcpPacket() {
583b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    memset(&nack_, 0, sizeof(nack_));
584b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
585b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
586b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  virtual ~Nack() {}
587b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
588b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void From(uint32_t ssrc) {
589b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    nack_.SenderSSRC = ssrc;
590b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
591b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void To(uint32_t ssrc) {
592b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    nack_.MediaSSRC = ssrc;
593b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
594b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void WithList(const uint16_t* nack_list, int length);
595b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
596b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org protected:
597847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
598847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
599b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
600b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org private:
601847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
602847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    size_t fci_length = 4 * nack_fields_.size();
603847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kCommonFbFmtLength + fci_length;
604b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
605b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
606b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  RTCPUtility::RTCPPacketRTPFBNACK nack_;
607b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketRTPFBNACKItem> nack_fields_;
608b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
609b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Nack);
610b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org};
611b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
612b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org// Reference picture selection indication (RPSI) (RFC 4585).
613b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//
614b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org// FCI:
615b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//
616b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//    0                   1                   2                   3
617b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//    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
618b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
619b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   |      PB       |0| Payload Type|    Native RPSI bit string     |
620b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
621b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   |   defined per codec          ...                | Padding (0) |
622b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
623b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
624b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.orgclass Rpsi : public RtcpPacket {
625b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org public:
626b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  Rpsi()
627847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      : RtcpPacket(),
628847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org        padding_bytes_(0) {
629b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    memset(&rpsi_, 0, sizeof(rpsi_));
630b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
631b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
632b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  virtual ~Rpsi() {}
633b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
634b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void From(uint32_t ssrc) {
635b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    rpsi_.SenderSSRC = ssrc;
636b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
637b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void To(uint32_t ssrc) {
638b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    rpsi_.MediaSSRC = ssrc;
639b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
640b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void WithPayloadType(uint8_t payload) {
641b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    assert(payload <= 0x7f);
642b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org    rpsi_.PayloadType = payload;
643b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
644b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  void WithPictureId(uint64_t picture_id);
645b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
646b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org protected:
647847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
648847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
649b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
650b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org private:
651847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
652847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    size_t fci_length = 2 + (rpsi_.NumberOfValidBits / 8) + padding_bytes_;
653847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kCommonFbFmtLength + fci_length;
654b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  }
655b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
656b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  uint8_t padding_bytes_;
657b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBRPSI rpsi_;
658b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org
659b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Rpsi);
660b5b864863573bcf0a341e6462fe697450c64a873asapersson@webrtc.org};
661663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
662663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Full intra request (FIR) (RFC 5104).
663663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
664663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// FCI:
665663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
666663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//    0                   1                   2                   3
667663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//    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
668663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
669663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   |                              SSRC                             |
670663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
671663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   | Seq nr.       |    Reserved                                   |
672663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
673663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
674663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass Fir : public RtcpPacket {
675663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
6767eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Fir() : RtcpPacket() {
677663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    memset(&fir_, 0, sizeof(fir_));
678663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    memset(&fir_item_, 0, sizeof(fir_item_));
679663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
680663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
681663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  virtual ~Fir() {}
682663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
683663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void From(uint32_t ssrc) {
684663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    fir_.SenderSSRC = ssrc;
685663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
686663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void To(uint32_t ssrc) {
687663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    fir_item_.SSRC = ssrc;
688663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
689663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  void WithCommandSeqNum(uint8_t seq_num) {
690663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org    fir_item_.CommandSequenceNumber = seq_num;
691663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
692663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
693663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org protected:
694847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  virtual void Create(
695847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
696663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
697663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
698847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t BlockLength() const {
699847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    const size_t kFciLength = 8;
700847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return kCommonFbFmtLength + kFciLength;
701663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
702663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
703663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBFIR fir_;
704663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBFIRItem fir_item_;
705663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
706663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
7077eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// Temporary Maximum Media Stream Bit Rate Request (TMMBR) (RFC 5104).
7087eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
7097eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// FCI:
7107eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
7117eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    0                   1                   2                   3
7127eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    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
7137eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7147eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |                              SSRC                             |
7157eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7167eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   | MxTBR Exp |  MxTBR Mantissa                 |Measured Overhead|
7177eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7187eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7197eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Tmmbr : public RtcpPacket {
7207eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
7217eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Tmmbr() : RtcpPacket() {
7227eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&tmmbr_, 0, sizeof(tmmbr_));
7237eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&tmmbr_item_, 0, sizeof(tmmbr_item_));
7247eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7257eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7267eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual ~Tmmbr() {}
7277eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7287eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void From(uint32_t ssrc) {
7297eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    tmmbr_.SenderSSRC = ssrc;
7307eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7317eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void To(uint32_t ssrc) {
7327eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    tmmbr_item_.SSRC = ssrc;
7337eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7347eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithBitrateKbps(uint32_t bitrate_kbps) {
7357eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    tmmbr_item_.MaxTotalMediaBitRate = bitrate_kbps;
7367eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7377eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithOverhead(uint16_t overhead) {
7387eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    assert(overhead <= 0x1ff);
7397eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    tmmbr_item_.MeasuredOverhead = overhead;
7407eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7417eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7427eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org protected:
7437eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual void Create(
7447eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
7457eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7467eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
7477eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t BlockLength() const {
7487eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    const size_t kFciLen = 8;
7497eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return kCommonFbFmtLength + kFciLen;
7507eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7517eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7527eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketRTPFBTMMBR tmmbr_;
7537eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketRTPFBTMMBRItem tmmbr_item_;
7547eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7557eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Tmmbr);
7567eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
7577eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7587eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// Temporary Maximum Media Stream Bit Rate Notification (TMMBN) (RFC 5104).
7597eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
7607eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// FCI:
7617eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
7627eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    0                   1                   2                   3
7637eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    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
7647eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7657eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |                              SSRC                             |
7667eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7677eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   | MxTBR Exp |  MxTBR Mantissa                 |Measured Overhead|
7687eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
7697eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7707eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Tmmbn : public RtcpPacket {
7717eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
7727eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Tmmbn() : RtcpPacket() {
7737eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&tmmbn_, 0, sizeof(tmmbn_));
7747eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7757eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7767eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual ~Tmmbn() {}
7777eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7787eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void From(uint32_t ssrc) {
7797eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    tmmbn_.SenderSSRC = ssrc;
7807eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7817eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
7827eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7837eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org protected:
7847eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual void Create(
7857eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
7867eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7877eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
7887eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfTmmbrs = 50 };
7897eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7907eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t BlockLength() const {
7917eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    const size_t kFciLen = 8;
7927eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return kCommonFbFmtLength + kFciLen * tmmbn_items_.size();
7937eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
7947eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7957eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_;
7967eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketRTPFBTMMBRItem> tmmbn_items_;
7977eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
7987eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Tmmbn);
7997eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
8007eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8017eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// Receiver Estimated Max Bitrate (REMB) (draft-alvestrand-rmcat-remb).
8027eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
8037eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    0                   1                   2                   3
8047eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//    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
8057eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8067eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |V=2|P| FMT=15  |   PT=206      |             length            |
8077eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8087eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |                  SSRC of packet sender                        |
8097eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8107eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |                  SSRC of media source                         |
8117eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8127eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |  Unique identifier 'R' 'E' 'M' 'B'                            |
8137eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8147eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |  Num SSRC     | BR Exp    |  BR Mantissa                      |
8157eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8167eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |   SSRC feedback                                               |
8177eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8187eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   |  ...
8197eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8207eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Remb : public RtcpPacket {
8217eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
8227eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Remb() : RtcpPacket() {
8237eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&remb_, 0, sizeof(remb_));
8247eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&remb_item_, 0, sizeof(remb_item_));
8257eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8267eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8277eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual ~Remb() {}
8287eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8297eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void From(uint32_t ssrc) {
8307eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    remb_.SenderSSRC = ssrc;
8317eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8327eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void AppliesTo(uint32_t ssrc);
8337eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8347eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithBitrateBps(uint32_t bitrate_bps) {
8357eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    remb_item_.BitRate = bitrate_bps;
8367eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8377eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8387eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org protected:
8397eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual void Create(
8407eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
8417eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8427eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
8437eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfSsrcs = 0xff };
8447eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8457eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t BlockLength() const {
8467eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return (remb_item_.NumberOfSSRCs + 5) * 4;
8477eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8487eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8497eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBAPP remb_;
8507eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketPSFBREMBItem remb_item_;
8517eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8527eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Remb);
8537eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
8547eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8557eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR).
8567eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
8577eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// Format for XR packets:
8587eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
8597eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   0                   1                   2                   3
8607eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   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
8617eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8627eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |V=2|P|reserved |   PT=XR=207   |             length            |
8637eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8647eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                              SSRC                             |
8657eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8667eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  :                         report blocks                         :
8677eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8687eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8697eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Xr : public RtcpPacket {
8707eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
8717eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  typedef std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> DlrrBlock;
8727eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Xr() : RtcpPacket() {
8737eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&xr_header_, 0, sizeof(xr_header_));
8747eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8757eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8767eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual ~Xr() {}
8777eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8787eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void From(uint32_t ssrc) {
8797eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    xr_header_.OriginatorSSRC = ssrc;
8807eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8817eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithRrtr(Rrtr* rrtr);
8827eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithDlrr(Dlrr* dlrr);
8837eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithVoipMetric(VoipMetric* voip_metric);
8847eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8857eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org protected:
8867eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  virtual void Create(
8877eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org      uint8_t* packet, size_t* length, size_t max_length) const OVERRIDE;
8887eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8897eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
8907eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfRrtrBlocks = 50 };
8917eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfDlrrBlocks = 50 };
8927eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfVoipMetricBlocks = 50 };
8937eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8947eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t BlockLength() const {
8957eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    const size_t kXrHeaderLength = 8;
8967eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return kXrHeaderLength + RrtrLength() + DlrrLength() + VoipMetricLength();
8977eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
8987eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
8997eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t RrtrLength() const {
9007eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    const size_t kRrtrBlockLength = 12;
9017eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return kRrtrBlockLength * rrtr_blocks_.size();
9027eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
9037eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9047eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t DlrrLength() const;
9057eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9067eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  size_t VoipMetricLength() const {
9077eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    const size_t kVoipMetricBlockLength = 36;
9087eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    return kVoipMetricBlockLength * voip_metric_blocks_.size();
9097eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
9107eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9117eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketXR xr_header_;
9127eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem> rrtr_blocks_;
9137eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  std::vector<DlrrBlock> dlrr_blocks_;
9147eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketXRVOIPMetricItem> voip_metric_blocks_;
9157eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9167eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Xr);
9177eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
9187eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9197eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// Receiver Reference Time Report Block (RFC 3611).
9207eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
9217eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   0                   1                   2                   3
9227eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   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
9237eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9247eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |     BT=4      |   reserved    |       block length = 2        |
9257eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9267eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |              NTP timestamp, most significant word             |
9277eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9287eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |             NTP timestamp, least significant word             |
9297eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9307eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9317eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Rrtr {
9327eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
9337eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Rrtr() {
9347eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&rrtr_block_, 0, sizeof(rrtr_block_));
9357eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
9367eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  ~Rrtr() {}
9377eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9387eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithNtpSec(uint32_t sec) {
9397eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    rrtr_block_.NTPMostSignificant = sec;
9407eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
9417eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithNtpFrac(uint32_t frac) {
9427eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    rrtr_block_.NTPLeastSignificant = frac;
9437eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
9447eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9457eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
9467eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  friend class Xr;
9477eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketXRReceiverReferenceTimeItem rrtr_block_;
9487eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9497eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Rrtr);
9507eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
9517eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9527eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// DLRR Report Block (RFC 3611).
9537eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
9547eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   0                   1                   2                   3
9557eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   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
9567eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9577eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |     BT=5      |   reserved    |         block length          |
9587eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
9597eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                 SSRC_1 (SSRC of first receiver)               | sub-
9607eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
9617eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                         last RR (LRR)                         |   1
9627eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9637eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                   delay since last RR (DLRR)                  |
9647eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
9657eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                 SSRC_2 (SSRC of second receiver)              | sub-
9667eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
9677eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  :                               ...                             :   2
9687eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9697eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass Dlrr {
9707eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
9717eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  Dlrr() {}
9727eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  ~Dlrr() {}
9737eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9747eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr);
9757eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9767eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
9777eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  friend class Xr;
9787eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  enum { kMaxNumberOfDlrrItems = 100 };
9797eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9807eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  std::vector<RTCPUtility::RTCPPacketXRDLRRReportBlockItem> dlrr_block_;
9817eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9827eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Dlrr);
9837eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
9847eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
9857eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org// VoIP Metrics Report Block (RFC 3611).
9867eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//
9877eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   0                   1                   2                   3
9887eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//   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
9897eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9907eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |     BT=7      |   reserved    |       block length = 8        |
9917eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9927eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |                        SSRC of source                         |
9937eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9947eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |   loss rate   | discard rate  | burst density |  gap density  |
9957eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9967eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |       burst duration          |         gap duration          |
9977eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9987eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |     round trip delay          |       end system delay        |
9997eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10007eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  | signal level  |  noise level  |     RERL      |     Gmin      |
10017eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10027eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |   R factor    | ext. R factor |    MOS-LQ     |    MOS-CQ     |
10037eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10047eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |   RX config   |   reserved    |          JB nominal           |
10057eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10067eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  |          JB maximum           |          JB abs max           |
10077eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10087eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
10097eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.orgclass VoipMetric {
10107eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org public:
10117eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  VoipMetric() {
10127eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    memset(&metric_, 0, sizeof(metric_));
10137eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10147eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  ~VoipMetric() {}
10157eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
10167eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void To(uint32_t ssrc) { metric_.SSRC = ssrc; }
10177eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void LossRate(uint8_t loss_rate) { metric_.lossRate = loss_rate; }
10187eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void DiscardRate(uint8_t discard_rate) { metric_.discardRate = discard_rate; }
10197eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void BurstDensity(uint8_t burst_density) {
10207eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    metric_.burstDensity = burst_density;
10217eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10227eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void GapDensity(uint8_t gap_density) { metric_.gapDensity = gap_density; }
10237eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void BurstDuration(uint16_t burst_duration) {
10247eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    metric_.burstDuration = burst_duration;
10257eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10267eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void GapDuration(uint16_t gap_duration) {
10277eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    metric_.gapDuration = gap_duration;
10287eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10297eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void RoundTripDelay(uint16_t round_trip_delay) {
10307eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    metric_.roundTripDelay = round_trip_delay;
10317eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10327eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void EndSystemDelay(uint16_t end_system_delay) {
10337eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org    metric_.endSystemDelay = end_system_delay;
10347eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  }
10357eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void SignalLevel(uint8_t signal_level) { metric_.signalLevel = signal_level; }
10367eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void NoiseLevel(uint8_t noise_level) { metric_.noiseLevel = noise_level; }
10377eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void Rerl(uint8_t rerl) { metric_.RERL = rerl; }
10387eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void Gmin(uint8_t gmin) { metric_.Gmin = gmin; }
10397eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void Rfactor(uint8_t rfactor) { metric_.Rfactor = rfactor; }
10407eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void ExtRfactor(uint8_t extrfactor) { metric_.extRfactor = extrfactor; }
10417eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void MosLq(uint8_t moslq) { metric_.MOSLQ = moslq; }
10427eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void MosCq(uint8_t moscq) { metric_.MOSCQ = moscq; }
10437eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void RxConfig(uint8_t rxconfig) { metric_.RXconfig = rxconfig; }
10447eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void JbNominal(uint16_t jbnominal) { metric_.JBnominal = jbnominal; }
10457eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void JbMax(uint16_t jbmax) { metric_.JBmax = jbmax; }
10467eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  void JbAbsMax(uint16_t jbabsmax) { metric_.JBabsMax = jbabsmax; }
10477eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
10487eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org private:
10497eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  friend class Xr;
10507eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  RTCPUtility::RTCPPacketXRVOIPMetricItem metric_;
10517eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
10527eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org  DISALLOW_COPY_AND_ASSIGN(VoipMetric);
10537eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org};
10547eec1dd08bce4d7a30d090c67a240c274b95755casapersson@webrtc.org
1055663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Class holding a RTCP packet.
1056663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
1057663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// Takes a built rtcp packet.
1058847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org//  RawPacket raw_packet(buffer, length);
1059663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//
1060663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org// To access the raw packet:
1061663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  raw_packet.buffer();         - pointer to the raw packet
1062663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org//  raw_packet.buffer_length();  - the length of the raw packet
1063663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
1064663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.orgclass RawPacket {
1065663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org public:
1066847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  RawPacket(const uint8_t* packet, size_t length) {
1067847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    assert(length <= IP_PACKET_SIZE);
1068847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    memcpy(buffer_, packet, length);
1069847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    buffer_length_ = length;
1070663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
1071663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
1072663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  const uint8_t* buffer() {
1073847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return buffer_;
1074663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
1075847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t buffer_length() const {
1076847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org    return buffer_length_;
1077663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org  }
1078663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
1079663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org private:
1080847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  size_t buffer_length_;
1081847dfa535730a30d57cf26d788d31070b70a02afasapersson@webrtc.org  uint8_t buffer_[IP_PACKET_SIZE];
1082663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org};
1083663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org
1084663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org}  // namespace rtcp
1085663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org}  // namespace webrtc
1086663ba07859170b985f47fb4ce8fd9af947e440efasapersson@webrtc.org#endif  // WEBRTC_MODULES_RTP_RTCP_RTCP_PACKET_H_
1087