#ifndef _rtcp_header_h_ #define _rtcp_header_h_ #include #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_ */