|
- /*
- * 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_ */
|