blob: f99b5b9290154c8b66ee25e90a8b9d1fe021bc8c [file] [log] [blame]
/*
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*
*/
#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
#include "webrtc/rtc_base/basictypes.h"
#include "webrtc/rtc_base/buffer.h"
namespace webrtc {
namespace rtcp {
// Class for building RTCP packets.
//
// Example:
// ReportBlock report_block;
// report_block.SetMediaSsrc(234);
// report_block.SetFractionLost(10);
//
// ReceiverReport rr;
// rr.SetSenderSsrc(123);
// rr.AddReportBlock(report_block);
//
// Fir fir;
// fir.SetSenderSsrc(123);
// fir.AddRequestTo(234, 56);
//
// size_t length = 0; // Builds an intra frame request
// uint8_t packet[kPacketSize]; // with sequence number 56.
// fir.Build(packet, &length, kPacketSize);
//
// rtc::Buffer packet = fir.Build(); // Returns a RawPacket holding
// // the built rtcp packet.
//
// CompoundPacket compound; // Builds a compound RTCP packet with
// compound.Append(&rr); // a receiver report, report block
// compound.Append(&fir); // and fir message.
// rtc::Buffer packet = compound.Build();
class RtcpPacket {
public:
// Callback used to signal that an RTCP packet is ready. Note that this may
// not contain all data in this RtcpPacket; if a packet cannot fit in
// max_length bytes, it will be fragmented and multiple calls to this
// callback will be made.
class PacketReadyCallback {
public:
virtual void OnPacketReady(uint8_t* data, size_t length) = 0;
protected:
PacketReadyCallback() {}
virtual ~PacketReadyCallback() {}
};
virtual ~RtcpPacket() {}
// Convenience method mostly used for test. Creates packet without
// fragmentation using BlockLength() to allocate big enough buffer.
rtc::Buffer Build() const;
// Returns true if call to Create succeeded. Provided buffer reference
// will be used for all calls to callback.
bool BuildExternalBuffer(uint8_t* buffer,
size_t max_length,
PacketReadyCallback* callback) const;
// Size of this packet in bytes (including headers).
virtual size_t BlockLength() const = 0;
// Creates packet in the given buffer at the given position.
// Calls PacketReadyCallback::OnPacketReady if remaining buffer is too small
// and assume buffer can be reused after OnPacketReady returns.
virtual bool Create(uint8_t* packet,
size_t* index,
size_t max_length,
PacketReadyCallback* callback) const = 0;
protected:
// Size of the rtcp common header.
static constexpr size_t kHeaderLength = 4;
RtcpPacket() {}
static void CreateHeader(uint8_t count_or_format,
uint8_t packet_type,
size_t block_length, // Payload size in 32bit words.
uint8_t* buffer,
size_t* pos);
bool OnBufferFull(uint8_t* packet,
size_t* index,
PacketReadyCallback* callback) const;
// Size of the rtcp packet as written in header.
size_t HeaderLength() const;
};
} // namespace rtcp
} // namespace webrtc
#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_