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