stream-deploy/ZLM/3rdpart/media-server/librtp/include/rtcp-header.h

445 lines
11 KiB
C++

#ifndef _rtcp_header_h_
#define _rtcp_header_h_
#include <stdint.h>
#define RTCP_V(v) ((v >> 30) & 0x03) // rtcp version
#define RTCP_P(v) ((v >> 29) & 0x01) // rtcp padding
#define RTCP_RC(v) ((v >> 24) & 0x1F) // rtcp reception report count
#define RTCP_PT(v) ((v >> 16) & 0xFF) // rtcp packet type
#define RTCP_LEN(v) (v & 0xFFFF) // rtcp packet length
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml
enum rtcp_type_t
{
RTCP_FIR = 192, // RFC2032, Reserved (Historic-FIR)
RTCP_NACK = 193, // RFC2032, Reserved (Historic-NACK)
RTCP_SMPTETC= 194, // RFC5484
RTCP_IJ = 195, // RFC5450
RTCP_SR = 200,
RTCP_RR = 201,
RTCP_SDES = 202,
RTCP_BYE = 203,
RTCP_APP = 204,
RTCP_RTPFB = 205, // RFC4585
RTCP_PSFB = 206, // RFC4585
RTCP_XR = 207, // RFC3611
RTCP_AVB = 208,
RTCP_RSI = 209, // RFC5760
RTCP_TOKEN = 210, // RFC6284
RTCP_IDMS = 211, // RFC7272
RTCP_RGRS = 212, // RFC8861
RTCP_LIMIT = 223, // RFC5761 RTCP packet types in the ranges 1-191 and 224-254 SHOULD only be used when other values have been exhausted.
};
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-5
enum rtcp_sdes_type_t
{
RTCP_SDES_END = 0, // RFC3550
RTCP_SDES_CNAME = 1, // RFC3550
RTCP_SDES_NAME = 2, // RFC3550
RTCP_SDES_EMAIL = 3, // RFC3550
RTCP_SDES_PHONE = 4, // RFC3550
RTCP_SDES_LOC = 5, // RFC3550
RTCP_SDES_TOOL = 6, // RFC3550
RTCP_SDES_NOTE = 7, // RFC3550
RTCP_SDES_PRIVATE = 8, // RFC3550
RTCP_SDES_CADDR = 9, // H.323 callable address
RTCP_SDES_APSI = 10, // RFC6776
RTCP_SDES_RGRP = 11, // RFC8861
RTCP_SDES_RID = 12, // RFC8852
RTCP_SDES_RRID = 13, // RFC8852
RTCP_SDES_CCID = 14, // RFC8849
RTCP_SDES_MID = 15, // RFC8843
};
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-8
enum rtcp_rtpfb_type_t
{
RTCP_RTPFB_NACK = 1, // RFC4585, Generic NACK
RTCP_RTPFB_TMMBR = 3, // RFC5104, Temporary Maximum Media Stream Bit Rate Request (TMMBR)
RTCP_RTPFB_TMMBN = 4, // RFC5104, Temporary Maximum Media Stream Bit Rate Notification (TMMBN)
RTCP_RTPFB_SRREQ = 5, // RFC6051, RTCP Rapid Resynchronisation Request(RTCP-SR-REQ)
RTCP_RTPFB_RAMS = 6, // RFC6285, Rapid Acquisition of Multicast Sessions
RTCP_RTPFB_TLLEI = 7, // RFC6642, Transport-Layer Third-Party Loss Early Indication
RTCP_RTPFB_ECN = 8, // RFC6679, RTCP ECN Feedback
RTCP_RTPFB_PS = 9, // RFC7728, Media Pause/Resume
RTCP_RTPFB_DBI = 10, // 3GPP TS 26.114 v16.3.0, Delay Budget Information (DBI)
RTCP_RTPFB_CCFB = 11, // RFC8888, RTP Congestion Control Feedback
RTCP_RTPFB_TCC01 = 15, // draft-holmer-rmcat-transport-wide-cc-extensions-01
RTCP_RTPFB_EXT = 31,
};
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-9
enum rtcp_psfb_type_t
{
RTCP_PSFB_PLI = 1, // RFC4585, Picture Loss Indication (PLI)
RTCP_PSFB_SLI = 2, // RFC4585, Slice Loss Indication (SLI)
RTCP_PSFB_RPSI = 3, // RFC4585, Reference Picture Selection Indication (RPSI)
RTCP_PSFB_FIR = 4, // RFC5104, Full Intra Request (FIR)
RTCP_PSFB_TSTR = 5, // RFC5104, Temporal-Spatial Trade-off Request
RTCP_PSFB_TSTN = 6, // RFC5104, Temporal-Spatial Trade-off Notification
RTCP_PSFB_VBCM = 7, // RFC5104, Video Back Channel Message
RTCP_PSFB_PSLEI = 8, // RFC6642, Payload-Specific Third-Party Loss Early Indication
RTCP_PSFB_ROI = 9, // 3GPP TS 26.114 v16.3.0, Video region-of-interest (ROI)
RTCP_PSFB_LRR = 10, // RFC-ietf-avtext-lrr-07, Layer Refresh Request Command
RTCP_PSFB_AFB = 15, // RFC4585, Application layer FB (AFB) message
RTCP_PSFB_REMB = 15, // https://datatracker.ietf.org/doc/html/draft-alvestrand-rmcat-remb-03#section-2.2
RTCP_PSFB_EXT = 31,
};
// https://www.iana.org/assignments/rtcp-xr-block-types/rtcp-xr-block-types.xhtml
enum rtcp_xr_type_t
{
RTCP_XR_LRLE = 1, // RFC3611, Loss RLE Report Block
RTCP_XR_DRLE = 2, // RFC3611, Duplicate RLE Report Block
RTCP_XR_PRT = 3, // RFC3611, Packet Receipt Times Report Block
RTCP_XR_RRT = 4, // RFC3611, Receiver Reference Time Report Block
RTCP_XR_DLRR = 5, // RFC3611, DLRR Report Block
RTCP_XR_SS = 6, // RFC3611, Statistics Summary Report Block
RTCP_XR_VM = 7, // RFC3611, VoIP Metrics Report Block
RTCP_XR_RTCP = 8, // RFC5093, RTCP XR
RTCP_XR_IDMS = 12, // RFC7272, IDMS Report Block
RTCP_XR_ECN = 13, // RFC6679, ECN Summary Report
RTCP_XR_DISRLE = 25, // RFC7097, DRLE (Discard RLE Report)
RTCP_XR_BDR = 26, // RFC7243, BDR (Bytes Discarded Report)
RTCP_XR_RFISD = 27, // RFC7244, RFISD (RTP Flows Initial Synchronization Delay)
RTCP_XR_RFSO = 28, // RFC7244, RFSO (RTP Flows Synchronization Offset Metrics Block)
};
typedef struct _rtcp_header_t
{
uint32_t v:2; // version
uint32_t p:1; // padding
uint32_t rc:5; // reception report count
uint32_t pt:8; // packet type
uint32_t length:16; /* pkt len in words, w/o this word */
} rtcp_header_t;
typedef struct _rtcp_sr_t // sender report
{
uint32_t ssrc;
uint32_t ntpmsw; // ntp timestamp MSW(in second)
uint32_t ntplsw; // ntp timestamp LSW(in picosecond)
uint32_t rtpts; // rtp timestamp
uint32_t spc; // sender packet count
uint32_t soc; // sender octet count
} rtcp_sr_t;
typedef struct _rtcp_rr_t // receiver report
{
uint32_t ssrc;
} rtcp_rr_t;
typedef struct _rtcp_rb_t // report block
{
uint32_t ssrc;
uint32_t fraction:8; // fraction lost
uint32_t cumulative:24; // cumulative number of packets lost
uint32_t exthsn; // extended highest sequence number received
uint32_t jitter; // interarrival jitter
uint32_t lsr; // last SR
uint32_t dlsr; // delay since last SR
} rtcp_rb_t;
// source description RTCP packet
typedef struct _rtcp_sdes_item_t
{
uint8_t pt; // chunk type
uint8_t len;
uint8_t *data;
} rtcp_sdes_item_t;
typedef struct _rtcp_bye_t
{
const void* reason;
int bytes; // reason length
} rtcp_bye_t;
typedef struct _rtcp_app_t
{
uint8_t subtype;
char name[4];
void* data;
int bytes; // data length
} rtcp_app_t;
// Slice Loss Indication (SLI)
typedef struct _rtcp_sli_t
{
uint32_t first : 13; // The macroblock (MB) address of the first lost macroblock.
uint32_t number : 13; // The number of lost macroblocks, in scan order
uint32_t picture_id : 6;
} rtcp_sli_t;
// Full Intra Request (FIR)
typedef struct _rtcp_fir_t
{
uint32_t ssrc;
uint32_t sn : 8; // Command sequence number
uint32_t reserved : 19;
uint32_t index : 5; // for TSTR
} rtcp_fir_t;
// Video Back Channel Message (VBCM)
typedef struct _rtcp_vbcm_t
{
uint32_t ssrc;
uint32_t sn : 8; // Command sequence number
uint32_t reserved : 1;
uint32_t pt : 7;
uint32_t len: 16;
void* payload;
} rtcp_vbcm_t;
// Layer Refresh Request
typedef struct _rtcp_lrr_t
{
uint32_t ssrc;
uint32_t sn : 8; // Command sequence number
uint32_t c : 1;
uint32_t payload : 7;
uint32_t reserved : 16; // Reserved
uint32_t res1 : 5; // reserved
uint32_t ttid : 3; // Target Temporal Layer ID (TTID) (3 bits)
uint32_t tlid : 8; // Target Layer ID (TLID) (8 bits)
uint32_t res2 : 5; // reserved
uint32_t ctid : 3; // Current Temporal Layer ID (CTID) (3 bits)
uint32_t clid : 8; // Current Layer ID (CLID) (8 bits)
} rtcp_lrr_t;
// Generic NACK
typedef struct _rtcp_nack_t
{
uint16_t pid; // Packet ID (PID)
uint16_t blp; // bitmask of following lost packets (BLP)
} rtcp_nack_t;
// Temporary Maximum Media Stream Bit Rate Request (TMMBR)
typedef struct _rtcp_tmmbr_t
{
uint32_t ssrc;
uint32_t exp : 6; // MxTBR Exp (6 bits)
uint32_t mantissa : 17; // MxTBR Mantissa (17 bits)
uint32_t overhead : 9; // Measured Overhead (9 bits)
// maximum total media bit rate(MxTBR)
// MxTBR = mantissa * 2^exp
} rtcp_tmmbr_t;
// RTP/AVPF Transport-Layer ECN Feedback Packet(ECN)
typedef struct _rtcp_ecn_t
{
uint32_t ext_highest_seq; // 32-bit extended highest sequence number received
uint32_t ect[2]; // The 32-bit cumulative number of RTP packets received from this SSRC.
uint16_t ect_ce_counter;
uint16_t not_ect_counter;
uint16_t lost_packets_counter;
uint16_t duplication_counter;
} rtcp_ecn_t;
typedef struct _rtcp_remb_t
{
uint32_t ssrc;
uint32_t exp : 6; // BR Exp (6 bits)
uint32_t mantissa : 18; // BR Mantissa (18 bits) in bps
// maximum total media bit rate(MxTBR)
// MxTBR = mantissa * 2^exp
} rtcp_remb_t;
// RTP Congestion Control Feedback
typedef struct _rtcp_ccfb_t
{
uint32_t seq : 16;
uint32_t received : 1;
uint32_t ecn : 2; // 00 if not received or if ECN is not used
//uint32_t ato : 13;
int16_t ato; // ms * 1024, Arrival time offset (ATO, 13 bits) & (TCC-01 16 bits)
} rtcp_ccfb_t;
// DLRR Report Block
typedef struct _rtcp_dlrr_t
{
uint32_t ssrc;
uint32_t lrr;
uint32_t dlrr;
} rtcp_dlrr_t;
typedef struct _rtcp_rtpfb_t
{
uint32_t media; // media ssrc
union
{
// RTCP_RTPFB | (RTCP_RTPFB_NACK << 8)
// RTCP_RTPFB | (RTCP_RTPFB_TLLEI << 8)
struct
{
rtcp_nack_t* nack;
int count;
} nack;
// RTCP_RTPFB | (RTCP_RTPFB_TMMBR << 8)
// RTCP_RTPFB | (RTCP_RTPFB_TMMBN << 8)
struct
{
rtcp_tmmbr_t* tmmbr;
int count;
} tmmbr;
// RTCP_RTPFB | (RTCP_RTPFB_CCFB << 8)
// RTCP_RTPFB | (RTCP_RTPFB_TCC01 << 8)
struct
{
rtcp_ccfb_t* ccfb;
int count;
int32_t timestamp;
uint32_t begin : 16;
uint32_t cc : 8; // TCC01 only
uint32_t ssrc; // ccfb only
} tcc01;
// RTCP_RTPFB | (RTCP_RTPFB_PS << 8)
struct
{
uint32_t target;
uint32_t cmd : 8;
uint32_t len : 8;
uint32_t id : 16;
void* payload;
} ps;
// RTCP_RTPFB | (RTCP_RTPFB_ECN << 8)
rtcp_ecn_t ecn;
// RTCP_RTPFB | (RTCP_RTPFB_DBI << 8)
struct
{
uint32_t delay : 16;
uint32_t s : 1;
uint32_t q : 1;
} dbi;
} u;
} rtcp_rtpfb_t;
typedef struct _rtcp_psfb_t
{
uint32_t media; // media ssrc
union
{
// RTCP_PSFB | (RTCP_PSFB_PLI << 8)
// RTCP_PSFB | (RTCP_PSFB_SLI << 8)
struct
{
rtcp_sli_t* sli;
int count;
} sli;
// RTCP_PSFB | (RTCP_PSFB_FIR << 8)
// RTCP_PSFB | (RTCP_PSFB_TSTR << 8)
// RTCP_PSFB | (RTCP_PSFB_TSTN << 8)
struct
{
rtcp_fir_t* fir;
int count;
} fir;
// RTCP_PSFB | (RTCP_PSFB_VBCM << 8)
struct
{
uint8_t pt;
uint32_t len; // length in bit
void* payload;
} rpsi;
// RTCP_PSFB | (RTCP_PSFB_VBCM << 8)
rtcp_vbcm_t vbcm;
// RTCP_PSFB | (RTCP_PSFB_PSLEI << 8)
struct
{
uint32_t* ssrc;
int count;
} pslei;
// RTCP_PSFB | (RTCP_PSFB_LRR << 8)
struct
{
rtcp_lrr_t* lrr;
int count;
} lrr;
// RTCP_PSFB | (RTCP_PSFB_AFB << 8)
struct
{
rtcp_remb_t* remb;
int count;
} afb;
} u;
} rtcp_psfb_t;
typedef struct _rtcp_xr_t
{
union
{
// RTCP_XR | (RTCP_XR_LRLE << 8)
// RTCP_XR | (RTCP_XR_DRLE << 8)
struct
{
uint32_t source; // SSRC of source
uint32_t begin : 16; // begin_seq
uint32_t end : 16; // end_seq
uint8_t* chunk;
int count;
} rle; // lrle/drle
// RTCP_XR | (RTCP_XR_PRT << 8)
struct
{
uint32_t source; // SSRC of source
uint32_t begin : 16; // begin_seq
uint32_t end : 16; // end_seq
uint32_t* timestamp;
int count;
} prt;
// RTCP_XR | (RTCP_XR_RRT << 8)
uint64_t rrt;
// RTCP_XR | (RTCP_XR_DLRR << 8)
struct
{
rtcp_dlrr_t* dlrr;
int count;
} dlrr;
// RTCP_XR | (RTCP_XR_ECN << 8)
rtcp_ecn_t ecn;
} u;
} rtcp_xr_t;
#endif /* !_rtcp_header_h_ */