
BUG=163 R=pwestin@webrtc.org Review URL: https://webrtc-codereview.appspot.com/1904005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4444 4adac7df-926f-26a2-2b94-8c16560cd09d
312 lines
8.2 KiB
C++
312 lines
8.2 KiB
C++
/*
|
|
* Copyright (c) 2012 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_INTERFACE_RTP_RTCP_DEFINES_H_
|
|
#define WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_
|
|
|
|
#include "webrtc/modules/interface/module_common_types.h"
|
|
#include "webrtc/system_wrappers/interface/clock.h"
|
|
#include "webrtc/typedefs.h"
|
|
|
|
#ifndef NULL
|
|
#define NULL 0
|
|
#endif
|
|
|
|
#define RTCP_CNAME_SIZE 256 // RFC 3550 page 44, including null termination
|
|
#define IP_PACKET_SIZE 1500 // we assume ethernet
|
|
#define MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS 10
|
|
#define TIMEOUT_SEI_MESSAGES_MS 30000 // in milliseconds
|
|
|
|
namespace webrtc{
|
|
|
|
const int32_t kDefaultVideoFrequency = 90000;
|
|
|
|
enum RTCPMethod
|
|
{
|
|
kRtcpOff = 0,
|
|
kRtcpCompound = 1,
|
|
kRtcpNonCompound = 2
|
|
};
|
|
|
|
enum RTPAliveType
|
|
{
|
|
kRtpDead = 0,
|
|
kRtpNoRtp = 1,
|
|
kRtpAlive = 2
|
|
};
|
|
|
|
enum StorageType {
|
|
kDontStore,
|
|
kDontRetransmit,
|
|
kAllowRetransmission
|
|
};
|
|
|
|
enum RTPExtensionType
|
|
{
|
|
kRtpExtensionNone,
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
kRtpExtensionAudioLevel,
|
|
kRtpExtensionAbsoluteSendTime
|
|
};
|
|
|
|
enum RTCPAppSubTypes
|
|
{
|
|
kAppSubtypeBwe = 0x00
|
|
};
|
|
|
|
enum RTCPPacketType
|
|
{
|
|
kRtcpReport = 0x0001,
|
|
kRtcpSr = 0x0002,
|
|
kRtcpRr = 0x0004,
|
|
kRtcpBye = 0x0008,
|
|
kRtcpPli = 0x0010,
|
|
kRtcpNack = 0x0020,
|
|
kRtcpFir = 0x0040,
|
|
kRtcpTmmbr = 0x0080,
|
|
kRtcpTmmbn = 0x0100,
|
|
kRtcpSrReq = 0x0200,
|
|
kRtcpXrVoipMetric = 0x0400,
|
|
kRtcpApp = 0x0800,
|
|
kRtcpSli = 0x4000,
|
|
kRtcpRpsi = 0x8000,
|
|
kRtcpRemb = 0x10000,
|
|
kRtcpTransmissionTimeOffset = 0x20000
|
|
};
|
|
|
|
enum KeyFrameRequestMethod
|
|
{
|
|
kKeyFrameReqFirRtp = 1,
|
|
kKeyFrameReqPliRtcp = 2,
|
|
kKeyFrameReqFirRtcp = 3
|
|
};
|
|
|
|
enum RtpRtcpPacketType
|
|
{
|
|
kPacketRtp = 0,
|
|
kPacketKeepAlive = 1
|
|
};
|
|
|
|
enum NACKMethod
|
|
{
|
|
kNackOff = 0,
|
|
kNackRtcp = 2
|
|
};
|
|
|
|
enum RetransmissionMode {
|
|
kRetransmitOff = 0x0,
|
|
kRetransmitFECPackets = 0x1,
|
|
kRetransmitBaseLayer = 0x2,
|
|
kRetransmitHigherLayers = 0x4,
|
|
kRetransmitAllPackets = 0xFF
|
|
};
|
|
|
|
enum RtxMode {
|
|
kRtxOff = 0,
|
|
kRtxRetransmitted = 1, // Apply RTX only to retransmitted packets.
|
|
kRtxAll = 2 // Apply RTX to all packets (source + retransmissions).
|
|
};
|
|
|
|
const int kRtxHeaderSize = 2;
|
|
|
|
struct RTCPSenderInfo
|
|
{
|
|
uint32_t NTPseconds;
|
|
uint32_t NTPfraction;
|
|
uint32_t RTPtimeStamp;
|
|
uint32_t sendPacketCount;
|
|
uint32_t sendOctetCount;
|
|
};
|
|
|
|
struct RTCPReportBlock
|
|
{
|
|
// Fields as described by RFC 3550 6.4.2.
|
|
uint32_t remoteSSRC; // SSRC of sender of this report.
|
|
uint32_t sourceSSRC; // SSRC of the RTP packet sender.
|
|
uint8_t fractionLost;
|
|
uint32_t cumulativeLost; // 24 bits valid
|
|
uint32_t extendedHighSeqNum;
|
|
uint32_t jitter;
|
|
uint32_t lastSR;
|
|
uint32_t delaySinceLastSR;
|
|
};
|
|
|
|
class RtpData
|
|
{
|
|
public:
|
|
virtual int32_t OnReceivedPayloadData(
|
|
const uint8_t* payloadData,
|
|
const uint16_t payloadSize,
|
|
const WebRtcRTPHeader* rtpHeader) = 0;
|
|
protected:
|
|
virtual ~RtpData() {}
|
|
};
|
|
|
|
class RtcpFeedback
|
|
{
|
|
public:
|
|
virtual void OnApplicationDataReceived(const int32_t /*id*/,
|
|
const uint8_t /*subType*/,
|
|
const uint32_t /*name*/,
|
|
const uint16_t /*length*/,
|
|
const uint8_t* /*data*/) {};
|
|
|
|
virtual void OnXRVoIPMetricReceived(
|
|
const int32_t /*id*/,
|
|
const RTCPVoIPMetric* /*metric*/) {};
|
|
|
|
virtual void OnRTCPPacketTimeout(const int32_t /*id*/) {};
|
|
|
|
virtual void OnReceiveReportReceived(const int32_t id,
|
|
const uint32_t senderSSRC) {};
|
|
|
|
protected:
|
|
virtual ~RtcpFeedback() {}
|
|
};
|
|
|
|
class RtpFeedback
|
|
{
|
|
public:
|
|
// Receiving payload change or SSRC change. (return success!)
|
|
/*
|
|
* channels - number of channels in codec (1 = mono, 2 = stereo)
|
|
*/
|
|
virtual int32_t OnInitializeDecoder(
|
|
const int32_t id,
|
|
const int8_t payloadType,
|
|
const char payloadName[RTP_PAYLOAD_NAME_SIZE],
|
|
const int frequency,
|
|
const uint8_t channels,
|
|
const uint32_t rate) = 0;
|
|
|
|
virtual void OnPacketTimeout(const int32_t id) = 0;
|
|
|
|
virtual void OnReceivedPacket(const int32_t id,
|
|
const RtpRtcpPacketType packetType) = 0;
|
|
|
|
virtual void OnPeriodicDeadOrAlive(const int32_t id,
|
|
const RTPAliveType alive) = 0;
|
|
|
|
virtual void OnIncomingSSRCChanged( const int32_t id,
|
|
const uint32_t SSRC) = 0;
|
|
|
|
virtual void OnIncomingCSRCChanged( const int32_t id,
|
|
const uint32_t CSRC,
|
|
const bool added) = 0;
|
|
|
|
protected:
|
|
virtual ~RtpFeedback() {}
|
|
};
|
|
|
|
class RtpAudioFeedback {
|
|
public:
|
|
|
|
virtual void OnPlayTelephoneEvent(const int32_t id,
|
|
const uint8_t event,
|
|
const uint16_t lengthMs,
|
|
const uint8_t volume) = 0;
|
|
protected:
|
|
virtual ~RtpAudioFeedback() {}
|
|
};
|
|
|
|
class RtcpIntraFrameObserver {
|
|
public:
|
|
virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0;
|
|
|
|
virtual void OnReceivedSLI(uint32_t ssrc,
|
|
uint8_t picture_id) = 0;
|
|
|
|
virtual void OnReceivedRPSI(uint32_t ssrc,
|
|
uint64_t picture_id) = 0;
|
|
|
|
virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) = 0;
|
|
|
|
virtual ~RtcpIntraFrameObserver() {}
|
|
};
|
|
|
|
class RtcpBandwidthObserver {
|
|
public:
|
|
// REMB or TMMBR
|
|
virtual void OnReceivedEstimatedBitrate(const uint32_t bitrate) = 0;
|
|
|
|
virtual void OnReceivedRtcpReceiverReport(
|
|
const uint32_t ssrc,
|
|
const uint8_t fraction_loss,
|
|
const uint32_t rtt,
|
|
const uint32_t last_received_extended_high_seqNum,
|
|
const uint32_t now_ms) = 0;
|
|
|
|
virtual ~RtcpBandwidthObserver() {}
|
|
};
|
|
|
|
class RtcpRttObserver {
|
|
public:
|
|
virtual void OnRttUpdate(uint32_t rtt) = 0;
|
|
|
|
virtual ~RtcpRttObserver() {};
|
|
};
|
|
|
|
// Null object version of RtpFeedback.
|
|
class NullRtpFeedback : public RtpFeedback {
|
|
public:
|
|
virtual ~NullRtpFeedback() {}
|
|
|
|
virtual int32_t OnInitializeDecoder(
|
|
const int32_t id,
|
|
const int8_t payloadType,
|
|
const char payloadName[RTP_PAYLOAD_NAME_SIZE],
|
|
const int frequency,
|
|
const uint8_t channels,
|
|
const uint32_t rate) OVERRIDE {
|
|
return 0;
|
|
}
|
|
|
|
virtual void OnPacketTimeout(const int32_t id) OVERRIDE {}
|
|
|
|
virtual void OnReceivedPacket(const int32_t id,
|
|
const RtpRtcpPacketType packetType) OVERRIDE {}
|
|
|
|
virtual void OnPeriodicDeadOrAlive(const int32_t id,
|
|
const RTPAliveType alive) OVERRIDE {}
|
|
|
|
virtual void OnIncomingSSRCChanged(const int32_t id,
|
|
const uint32_t SSRC) OVERRIDE {}
|
|
|
|
virtual void OnIncomingCSRCChanged(const int32_t id,
|
|
const uint32_t CSRC,
|
|
const bool added) OVERRIDE {}
|
|
};
|
|
|
|
// Null object version of RtpData.
|
|
class NullRtpData : public RtpData {
|
|
public:
|
|
virtual ~NullRtpData() {}
|
|
virtual int32_t OnReceivedPayloadData(
|
|
const uint8_t* payloadData,
|
|
const uint16_t payloadSize,
|
|
const WebRtcRTPHeader* rtpHeader) OVERRIDE {
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
// Null object version of RtpAudioFeedback.
|
|
class NullRtpAudioFeedback : public RtpAudioFeedback {
|
|
public:
|
|
virtual ~NullRtpAudioFeedback() {}
|
|
|
|
virtual void OnPlayTelephoneEvent(const int32_t id,
|
|
const uint8_t event,
|
|
const uint16_t lengthMs,
|
|
const uint8_t volume) OVERRIDE {}
|
|
};
|
|
|
|
} // namespace webrtc
|
|
#endif // WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_
|