stream-deploy/ZLM/3rdpart/media-server/librtp/include/rtp-ext.h

355 lines
20 KiB
C++

/*
* Copyright (c) 2021 ireader <tao3@outlook.com>. All rights reserved.
*/
#ifndef _rtp_ext_h_
#define _rtp_ext_h_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
// https://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml
// https://www.iana.org/assignments/rtcp-xr-block-types/rtcp-xr-block-types.xhtml
/*
RTCP Control Packet Types (PT)
Value Abbrev. Name Reference
0 Reserved
1-191 Unassigned
192 Reserved (Historic-FIR) [RFC2032]
193 Reserved (Historic-NACK) [RFC2032]
194 SMPTETC SMPTE time-code mapping [RFC5484]
195 IJ Extended inter-arrival jitter report [RFC5450]
196-199 Unassigned
200 SR sender report [RFC3550]
201 RR receiver report [RFC3550]
202 SDES source description [RFC3550]
203 BYE goodbye [RFC3550]
204 APP application-defined [RFC3550]
205 RTPFB Generic RTP Feedback [RFC4585]
206 PSFB Payload-specific [RFC4585]
207 XR extended report [RFC3611]
208 AVB AVB RTCP packet ["Standard for Layer 3 Transport Protocol for Time Sensitive Applications in Local Area
Networks." Work in progress.]
209 RSI Receiver Summary Information [RFC5760]
210 TOKEN Port Mapping [RFC6284]
211 IDMS IDMS Settings [RFC7272]
212 RGRS Reporting Group Reporting Sources [RFC8861]
213 SNM Splicing Notification Message [RFC8286]
214-254 Unassigned
255 Reserved
RTP SDES Item Types
Value Abbrev. Name Reference
0 END end of SDES list [RFC3550]
1 CNAME canonical name [RFC3550]
2 NAME user name [RFC3550]
3 EMAIL user's electronic mail address [RFC3550]
4 PHONE user's phone number [RFC3550]
5 LOC geographic user location [RFC3550]
6 TOOL name of application or tool [RFC3550]
7 NOTE notice about the source [RFC3550]
8 PRIV private extensions [RFC3550]
9 H323-CADDR H.323 callable address [Vineet_Kumar]
10 APSI Application Specific Identifier [RFC6776]
11 RGRP Reporting Group Identifier [RFC8861]
12 RtpStreamId RTP Stream Identifier [RFC8852]
13 RepairedRtpStreamId Repaired RTP Stream Identifier [RFC8852]
14 CCID CLUE CaptId [RFC8849]
15 MID Media Identification [RFC-ietf-mmusic-rfc8843bis-05]
16-255 Unassigned
FMT Values for RTPFB Payload Types
Value Name Long Name Reference
1 Generic NACK Generic negative acknowledgement [RFC4585]
2 Reserved [RFC5104]
3 TMMBR Temporary Maximum Media Stream Bit Rate Request [RFC5104]
4 TMMBN Temporary Maximum Media Stream Bit Rate Notification [RFC5104]
5 RTCP-SR-REQ RTCP Rapid Resynchronisation Request [RFC6051]
6 RAMS Rapid Acquisition of Multicast Sessions [RFC6285]
7 TLLEI Transport-Layer Third-Party Loss Early Indication [RFC6642]
8 RTCP-ECN-FB RTCP ECN Feedback [RFC6679]
9 PAUSE-RESUME Media Pause/Resume [RFC7728]
10 DBI Delay Budget Information (DBI) [3GPP TS 26.114 v16.3.0][Ozgur_Oyman]
11 CCFB RTP Congestion Control Feedback [RFC8888]
12-30 Unassigned
31 Extension Reserved for future extensions [RFC4585]
FMT Values for PSFB Payload Types
Value Name Long Name Reference
1 PLI Picture Loss Indication [RFC4585]
2 SLI Slice Loss Indication [RFC4585]
3 RPSI Reference Picture Selection Indication [RFC4585]
4 FIR Full Intra Request Command [RFC5104]
5 TSTR Temporal-Spatial Trade-off Request [RFC5104]
6 TSTN Temporal-Spatial Trade-off Notification [RFC5104]
7 VBCM Video Back Channel Message [RFC5104]
8 PSLEI Payload-Specific Third-Party Loss Early Indication [RFC6642]
9 ROI Video region-of-interest (ROI) [3GPP TS 26.114 v16.3.0][Ozgur_Oyman]
10 LRR Layer Refresh Request Command [RFC-ietf-avtext-lrr-07]
11-14 Unassigned
15 AFB Application Layer Feedback [RFC4585]
16-30 Unassigned
31 Extension Reserved for future extensions [RFC4585]
RTP Compact Header Extensions
Extension URI Description Contact Reference
urn:ietf:params:rtp-hdrext:toffset Transmission Time offsets [Singer] [RFC5450]
urn:ietf:params:rtp-hdrext:smpte-tc SMPTE time-code mapping [Singer] [RFC5484]
urn:ietf:params:rtp-hdrext:ntp-64 Synchronisation metadata: 64-bit [Thomas_Schierl] [IETF Audio/Video Transport
timestamp format Working Group][RFC6051]
urn:ietf:params:rtp-hdrext:ntp-56 Synchronisation metadata: 56-bit [Thomas_Schierl] [IETF Audio/Video Transport
timestamp format Working Group][RFC6051]
urn:ietf:params:rtp-hdrext:ssrc-audio-level Audio Level [Jonathan_Lennox] [RFC6464]
urn:ietf:params:rtp-hdrext:csrc-audio-level Mixer-to-client audio level indicators [Emil_Ivov] [RFC6465]
urn:ietf:params:rtp-hdrext:encrypt Encrypted extension header element [Jonathan_Lennox] [RFC6904]
urn:3gpp:video-orientation Coordination of video orientation (CVO) [Specifications_Manager_3GPP] [3GPP TS 26.114, version
feature, see clause 6.2.3 12.5.0]
Higher granularity (6-bit) coordination [3GPP TS 26.114, version
urn:3gpp:video-orientation:6 of video orientation (CVO) feature, see [Specifications_Manager_3GPP] 12.5.0]
clause 6.2.3
Signalling of the arbitrary [3GPP TS 26.114, version
urn:3gpp:roi-sent region-of-interest (ROI) information for [Specifications_Manager_3GPP] 13.1.0]
the sent video, see clause 6.2.3.4
Signalling of the predefined [3GPP TS 26.114, version
urn:3gpp:predefined-roi-sent region-of-interest (ROI) information for [Specifications_Manager_3GPP] 13.1.0]
the sent video, see clause 6.2.3.4
Reserved as base URN for RTCP SDES items
urn:ietf:params:rtp-hdrext:sdes that are also defined as RTP compact Authors of [RFC7941] [RFC7941]
header extensions.
urn:ietf:params:rtp-hdrext:splicing-interval Splicing Interval [Jinwei_Xia] [RFC8286]
RTP SDES Compact Header Extensions
Extension URI Description Contact Reference
urn:ietf:params:rtp-hdrext:sdes:cname Source Description: Canonical Authors of [RFC7941] [RFC7941]
End-Point Identifier (SDES CNAME)
urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id RTP Stream Identifier [Adam_Roach] [RFC8852]
urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id RTP Repaired Stream Identifier [Adam_Roach] [RFC8852]
urn:ietf:params:rtp-hdrext:sdes:CaptId CLUE CaptId [Roni_Even] [RFC8849]
urn:ietf:params:rtp-hdrext:sdes:mid Media identification [IESG] [RFC-ietf-mmusic-rfc8843bis-05]
*/
enum RTPExtensionType {
RTP_HDREXT_PADDING = 0,
RTP_HDREXT_SSRC_AUDIO_LEVEL_ID, // [rfc6464] urn:ietf:params:rtp-hdrext:ssrc-audio-level
RTP_HDREXT_CSRC_AUDIO_LEVEL_ID, // [rfc6465] urn:ietf:params:rtp-hdrext:csrc-audio-level
RTP_HDREXT_FRAME_MARKING_ID, // [rfc8852] urn:ietf:params:rtp-hdrext:framemarking
RTP_HDREXT_SDES_MID_ID, // [rfc8852] urn:ietf:params:rtp-hdrext:sdes:mid
RTP_HDREXT_SDES_RTP_STREAM_ID, // urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
RTP_HDREXT_SDES_REPAIRED_RTP_STREAM_ID, // urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
RTP_HDREXT_TOFFSET_ID, // [rfc5450] urn:ietf:params:rtp-hdrext:toffset
RTP_HDREXT_VIDEO_ORIENTATION_ID, // urn:3gpp:video-orientation (http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf)
RTP_HDREXT_ABSOLUTE_SEND_TIME_ID, // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
RTP_HDREXT_ABSOLUTE_CAPTURE_TIME_ID, // http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time
RTP_HDREXT_TRANSPORT_WIDE_CC_ID_01, // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
RTP_HDREXT_TRANSPORT_WIDE_CC_ID, // http://www.webrtc.org/experiments/rtp-hdrext/transport-wide-cc-02
RTP_HDREXT_VIDEO_TIMING_ID, // http://www.webrtc.org/experiments/rtp-hdrext/video-timing
RTP_HDREXT_PLAYOUT_DELAY_ID, // http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
RTP_HDREXT_ONE_BYTE_RESERVED,
RTP_HDREXT_COLOR_SPACE_ID, // http://www.webrtc.org/experiments/rtp-hdrext/color-space
RTP_HDREXT_VIDEO_CONTENT_TYPE_ID, // http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
RTP_HDREXT_INBAND_CN_ID, // http://www.webrtc.org/experiments/rtp-hdrext/inband-cn
RTP_HDREXT_VIDEO_FRAME_TRACKING_ID, // http://www.webrtc.org/experiments/rtp-hdrext/video-frame-tracking-id
RTP_HDREXT_VIDEO_LAYERS_ALLOCATION_ID, // http://www.webrtc.org/experiments/rtp-hdrext/video-layers-allocation00
//RTP_HDREXT_GENERIC_FRAME_DESCRIPTOR_00, // http://www.webrtc.org/experiments/rtp-hdrext/generic-frame-descriptor-00
//RTP_HDREXT_GENERIC_FRAME_DESCRIPTOR_02, // http://www.webrtc.org/experiments/rtp-hdrext/generic-frame-descriptor-02
//RTP_HDREXT_ENCRYPT, // [rfc6904] urn:ietf:params:rtp-hdrext:encrypt
RTP_HDREXT_NUM
};
enum
{
RTP_HDREXT_PROFILE_ONE_BYTE = 0xBEDE,
RTP_HDREXT_PROFILE_TWO_BYTE = 0x1000,
RTP_HDREXT_PROFILE_TWO_BYTE_FILTER = 0xFFF0,
};
enum { RTP_VIDEO_CONTENT_TYPE_UNSPECIFIED = 0, RTP_VIDEO_CONTENT_TYPE_SCREENSHARE };
struct rtp_ext_uri_t
{
uint8_t id;
const char* uri;
};
struct rtp_ext_data_t
{
uint32_t id : 8;
uint32_t len : 8; // bytes
uint32_t off : 16; // offset
};
struct rtp_ext_absolute_capture_time_t
{
uint64_t timestamp; // absolute capture timestamp
uint64_t offset; // estimated capture clock offset
};
struct rtp_ext_transport_wide_cc_t
{
uint32_t seq : 16;
uint32_t t : 1;
uint32_t count : 15;
};
struct rtp_ext_video_orientation_t
{
int camera; // 1-Back-facing camera, 0-Front-facing camera
int flip; // 1-Horizontal flip operation
int rotaion; // 0/90/180/270
};
struct rtp_ext_video_timing_t
{
int flags; // 0x01-extension is set due to timer, 0x02-extension is set because the frame is larger than usual
uint16_t encode_start;
uint16_t encode_finish;
uint16_t packetization_complete;
uint16_t last_packet_left_the_pacer;
uint16_t network_timestamp;
uint16_t network_timestamp2;
};
struct rtp_ext_playout_delay_t
{
uint16_t min_delay;
uint16_t max_delay;
};
struct rtp_ext_color_space_t
{
uint8_t primaries; // Color primaries value according to ITU-T H.273 Table 2.
uint8_t transfer; // Transfer characteristic value according to ITU-T H.273 Table 3.
uint8_t matrix; // Matrix coefficients value according to ITU-T H.273 Table 4.
uint8_t range_chroma_siting; // https://www.webmproject.org/docs/container/#colour
// HDR metadata(tow-byte RTP header extension)
uint16_t luminance_max; // Luminance max, specified in nits, where 1 nit = 1 cd/m2. (16-bit unsigned integer)
uint16_t luminance_min; // Luminance min, scaled by a factor of 10000 and specified in the unit 1/10000 nits. (16-bit unsigned integer)
uint32_t mastering_metadata_primary_red; // CIE 1931 xy chromaticity coordinates of the primary red, scaled by a factor of 50000. (2x 16-bit unsigned integers)
uint32_t mastering_metadata_primary_green; // CIE 1931 xy chromaticity coordinates of the primary green, scaled by a factor of 50000. (2x 16-bit unsigned integers)
uint32_t mastering_metadata_primary_blue; // CIE 1931 xy chromaticity coordinates of the primary blue, scaled by a factor of 50000. (2x 16-bit unsigned integers)
uint32_t mastering_metadata_primary_white; // CIE 1931 xy chromaticity coordinates of the white point, scaled by a factor of 50000. (2x 16-bit unsigned integers)
uint16_t max_content_light_level; // Max content light level, specified in nits. (16-bit unsigned integer)
uint16_t max_frame_average_light_level; // Max frame average light level, specified in nits. (16-bit unsigned integer)
};
struct rtp_ext_frame_marking_t
{
uint32_t s : 1; /* Start of Frame */
uint32_t e : 1; /* End of Frame */
uint32_t i : 1; /* Independent Frame */
uint32_t d : 1; /* Discardable Frame */
uint32_t b : 1; /* Base Layer Sync */
uint32_t tid : 3; // The temporal layer ID of current frame
uint32_t lid : 8;
uint32_t tl0_pic_idx : 8; // 8 bits temporal layer zero index
};
struct rtp_ext_video_layers_allocation_t
{
uint8_t rid;
};
/// count: RTP_HDREXT_NUM-1(skip padding)
/// @return ext id/uri
const struct rtp_ext_uri_t* rtp_ext_list();
const struct rtp_ext_uri_t* rtp_ext_find_uri(const char* uri);
/// @param[out] exts parsed rtpext header payload offset/bytes (MUST memset(exts, 0, sizeof(exts)));
/// @return 0-ok, other-error
int rtp_ext_read(uint16_t profile, const uint8_t* data, int bytes, struct rtp_ext_data_t exts[256]);
/// @param[in] profile RTP_HDREXT_PROFILE_ONE_BYTE/RTP_HDREXT_PROFILE_TWO_BYTE, 0-auto(detect one/two byte by length)
/// @param[in] count rtp hdrext item count(exts)
/// @return >0-ok, other-error
int rtp_ext_write(uint16_t profile, const uint8_t* extension, const struct rtp_ext_data_t *exts, int count, uint8_t* data, int bytes);
/// @param[in] n should be at least bytes + 1
/// @return 0-ok, other-error
int rtp_ext_string_parse(const uint8_t* data, int bytes, char* v, int n);
/// @return write bytes
int rtp_ext_string_write(uint8_t* data, int bytes, const char* v, int n);
/// @param[out] activity 0-inactivity, 1-activity
/// @return 0-ok, other-error
int rtp_ext_ssrc_audio_level_parse(const uint8_t* data, int bytes, uint8_t* activity, uint8_t* level);
/// @return write bytes
int rtp_ext_ssrc_audio_level_write(uint8_t* data, int bytes, uint8_t activity, uint8_t level);
/// @return 0-ok, other-error
int rtp_ext_csrc_audio_level_parse(const uint8_t* data, int bytes, uint8_t levels[], int num);
/// @return write bytes
int rtp_ext_csrc_audio_level_write(uint8_t* data, int bytes, const uint8_t levels[], int num);
/// @return 0-ok, other-error
int rtp_ext_frame_marking_parse(const uint8_t* data, int bytes, struct rtp_ext_frame_marking_t* ext);
/// @return write bytes
int rtp_ext_frame_marking_write(uint8_t* data, int bytes, const struct rtp_ext_frame_marking_t* ext);
//int rtp_ext_sdes_mid(void* param, const uint8_t* data, int bytes);
//int rtp_ext_sdes_rtp_stream_id(void* param, const uint8_t* data, int bytes);
//int rtp_ext_sdes_repaired_rtp_stream_id(void* param, const uint8_t* data, int bytes);
/// @param[out] timestamp rtp time
/// @return 0-ok, other-error
int rtp_ext_toffset_parse(const uint8_t* data, int bytes, uint32_t* timestamp);
/// @return write bytes
int rtp_ext_toffset_write(uint8_t* data, int bytes, uint32_t timestamp);
/// @param[out] rotaion 0/90/180/270
/// @return 0-ok, other-error
int rtp_ext_video_orientation_parse(const uint8_t* data, int bytes, struct rtp_ext_video_orientation_t* ext);
/// @return write bytes
int rtp_ext_video_orientation_write(uint8_t* data, int bytes, const struct rtp_ext_video_orientation_t* ext);
/// @param[out] timestamp in millisecond
/// @return 0-ok, other-error
int rtp_ext_abs_send_time_parse(const uint8_t* data, int bytes, uint64_t* timestamp);
/// @return write bytes
int rtp_ext_abs_send_time_write(uint8_t* data, int bytes, uint64_t timestamp);
/// @return 0-ok, other-error
int rtp_ext_absolute_capture_time_parse(const uint8_t* data, int bytes, struct rtp_ext_absolute_capture_time_t* ext);
/// @return write bytes
int rtp_ext_absolute_capture_time_write(uint8_t* data, int bytes, const struct rtp_ext_absolute_capture_time_t* ext);
/// @return 0-ok, other-error
int rtp_ext_transport_wide_cc_parse(const uint8_t* data, int bytes, struct rtp_ext_transport_wide_cc_t* ext);
/// @return write bytes(2-v1, 4-v2)
int rtp_ext_transport_wide_cc_write(uint8_t* data, int bytes, const struct rtp_ext_transport_wide_cc_t* ext);
/// @return 0-ok, other-error
int rtp_ext_video_timing_parse(const uint8_t* data, int bytes, struct rtp_ext_video_timing_t* ext);
/// @return write bytes
int rtp_ext_video_timing_write(uint8_t* data, int bytes, const struct rtp_ext_video_timing_t* ext);
/// @return 0-ok, other-error
int rtp_ext_playout_delay_parse(const uint8_t* data, int bytes, struct rtp_ext_playout_delay_t* ext);
/// @return write bytes
int rtp_ext_playout_delay_write(uint8_t* data, int bytes, const struct rtp_ext_playout_delay_t* ext);
/// @return 0-ok, other-error
int rtp_ext_color_space_parse(const uint8_t* data, int bytes, struct rtp_ext_color_space_t* ext);
/// @return write bytes
int rtp_ext_color_space_write(uint8_t* data, int bytes, const struct rtp_ext_color_space_t* ext);
/// @return 0-ok, other-error
int rtp_ext_video_content_type_parse(const uint8_t* data, int bytes, uint8_t* ext);
/// @return write bytes
int rtp_ext_video_content_type_write(uint8_t* data, int bytes, uint8_t ext);
/// @return 0-ok, other-error
int rtp_ext_inband_cn_parse(const uint8_t* data, int bytes, uint8_t* level);
/// @return write bytes
int rtp_ext_inband_cn_write(uint8_t* data, int bytes, uint8_t level);
/// @return 0-ok, other-error
int rtp_ext_video_frame_tracking_id_parse(const uint8_t* data, int bytes, uint16_t* id);
/// @return write bytes
int rtp_ext_video_frame_tracking_id_write(uint8_t* data, int bytes, uint16_t id);
/// @return 0-ok, other-error
int rtp_ext_video_layers_allocation_parse(const uint8_t* data, int bytes, struct rtp_ext_video_layers_allocation_t* ext);
/// @return write bytes
int rtp_ext_video_layers_allocation_write(uint8_t* data, int bytes, const struct rtp_ext_video_layers_allocation_t* ext);
#ifdef __cplusplus
}
#endif
#endif /* !_rtp_ext_h_ */