RTP processing (headers) More...
#include <arpa/inet.h>
#include <endian.h>
#include <inttypes.h>
#include <string.h>
#include <glib.h>
Go to the source code of this file.
Data Structures | |
struct | rtp_header |
RTP Header (http://tools.ietf.org/html/rfc3550#section-5.1) More... | |
struct | janus_rtp_packet |
RTP packet. More... | |
struct | janus_rtp_header_extension |
RTP extension. More... | |
struct | janus_rtp_switching_context |
RTP context, in order to make sure SSRC changes result in coherent seq/ts increases. More... | |
struct | janus_rtp_simulcasting_context |
Helper struct for processing and tracking simulcast streams. More... | |
Macros | |
#define | RTP_HEADER_SIZE 12 |
#define | JANUS_RTP_EXTMAP_AUDIO_LEVEL "urn:ietf:params:rtp-hdrext:ssrc-audio-level" |
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level More... | |
#define | JANUS_RTP_EXTMAP_TOFFSET "urn:ietf:params:rtp-hdrext:toffset" |
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset More... | |
#define | JANUS_RTP_EXTMAP_ABS_SEND_TIME "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time" |
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time More... | |
#define | JANUS_RTP_EXTMAP_VIDEO_ORIENTATION "urn:3gpp:video-orientation" |
a=extmap:4 urn:3gpp:video-orientation More... | |
#define | JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01" |
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 More... | |
#define | JANUS_RTP_EXTMAP_PLAYOUT_DELAY "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay" |
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay More... | |
#define | JANUS_RTP_EXTMAP_RTP_STREAM_ID "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id" |
a=extmap:3/sendonly urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id More... | |
#define | RTP_AUDIO_SKEW_TH_MS 120 |
#define | RTP_VIDEO_SKEW_TH_MS 120 |
#define | SKEW_DETECTION_WAIT_TIME_SECS 10 |
Typedefs | |
typedef struct rtp_header | rtp_header |
RTP Header (http://tools.ietf.org/html/rfc3550#section-5.1) More... | |
typedef rtp_header | janus_rtp_header |
typedef struct janus_rtp_packet | janus_rtp_packet |
RTP packet. More... | |
typedef struct janus_rtp_header_extension | janus_rtp_header_extension |
RTP extension. More... | |
typedef struct janus_rtp_switching_context | janus_rtp_switching_context |
RTP context, in order to make sure SSRC changes result in coherent seq/ts increases. More... | |
typedef enum janus_audiocodec | janus_audiocodec |
typedef enum janus_videocodec | janus_videocodec |
typedef struct janus_rtp_simulcasting_context | janus_rtp_simulcasting_context |
Helper struct for processing and tracking simulcast streams. More... | |
Functions | |
gboolean | janus_is_rtp (char *buf, guint len) |
Helper method to demultiplex RTP from other protocols. More... | |
char * | janus_rtp_payload (char *buf, int len, int *plen) |
Helper to quickly access the RTP payload, skipping header and extensions. More... | |
int | janus_rtp_header_extension_get_id (const char *sdp, const char *extension) |
Ugly and dirty helper to quickly get the id associated with an RTP extension (extmap) in an SDP. More... | |
const char * | janus_rtp_header_extension_get_from_id (const char *sdp, int id) |
Ugly and dirty helper to quickly get the RTP extension namespace associated with an id (extmap) in an SDP. More... | |
int | janus_rtp_header_extension_parse_audio_level (char *buf, int len, int id, int *level) |
Helper to parse a ssrc-audio-level RTP extension (https://tools.ietf.org/html/rfc6464) More... | |
int | janus_rtp_header_extension_parse_video_orientation (char *buf, int len, int id, gboolean *c, gboolean *f, gboolean *r1, gboolean *r0) |
Helper to parse a video-orientation RTP extension (http://www.3gpp.org/ftp/Specs/html-info/26114.htm) More... | |
int | janus_rtp_header_extension_parse_playout_delay (char *buf, int len, int id, uint16_t *min_delay, uint16_t *max_delay) |
Helper to parse a playout-delay RTP extension (https://webrtc.org/experiments/rtp-hdrext/playout-delay) More... | |
int | janus_rtp_header_extension_parse_rtp_stream_id (char *buf, int len, int id, char *sdes_item, int sdes_len) |
Helper to parse a rtp-stream-id RTP extension (https://tools.ietf.org/html/draft-ietf-avtext-rid-09) More... | |
int | janus_rtp_header_extension_parse_transport_wide_cc (char *buf, int len, int id, uint16_t *transSeqNum) |
Helper to parse a rtp-stream-id RTP extension (https://tools.ietf.org/html/draft-ietf-avtext-rid-09) More... | |
void | janus_rtp_switching_context_reset (janus_rtp_switching_context *context) |
Set (or reset) the context fields to their default values. More... | |
void | janus_rtp_header_update (janus_rtp_header *header, janus_rtp_switching_context *context, gboolean video, int step) |
Use the context info to update the RTP header of a packet, if needed. More... | |
int | janus_rtp_skew_compensate_audio (janus_rtp_header *header, janus_rtp_switching_context *context, gint64 now) |
Use the context info to compensate for audio source skew, if needed. More... | |
int | janus_rtp_skew_compensate_video (janus_rtp_header *header, janus_rtp_switching_context *context, gint64 now) |
Use the context info to compensate for video source skew, if needed. More... | |
const char * | janus_audiocodec_name (janus_audiocodec acodec) |
janus_audiocodec | janus_audiocodec_from_name (const char *name) |
int | janus_audiocodec_pt (janus_audiocodec acodec) |
const char * | janus_videocodec_name (janus_videocodec vcodec) |
janus_videocodec | janus_videocodec_from_name (const char *name) |
int | janus_videocodec_pt (janus_videocodec vcodec) |
void | janus_rtp_simulcasting_context_reset (janus_rtp_simulcasting_context *context) |
Set (or reset) the context fields to their default values. More... | |
gboolean | janus_rtp_simulcasting_context_process_rtp (janus_rtp_simulcasting_context *context, char *buf, int len, uint32_t *ssrcs, janus_videocodec vcodec, janus_rtp_switching_context *sc) |
Process an RTP packet, and decide whether this should be relayed or not, updating the context accordingly. More... | |
RTP processing (headers)
Implementation of the RTP header. Since the server does not much more than relaying frames around, the only thing we're interested in is the RTP header and how to get its payload, and parsing extensions.
#define JANUS_RTP_EXTMAP_ABS_SEND_TIME "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time" |
#define JANUS_RTP_EXTMAP_AUDIO_LEVEL "urn:ietf:params:rtp-hdrext:ssrc-audio-level" |
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
#define JANUS_RTP_EXTMAP_PLAYOUT_DELAY "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay" |
#define JANUS_RTP_EXTMAP_RTP_STREAM_ID "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id" |
a=extmap:3/sendonly urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
#define JANUS_RTP_EXTMAP_TOFFSET "urn:ietf:params:rtp-hdrext:toffset" |
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
#define JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01" |
#define JANUS_RTP_EXTMAP_VIDEO_ORIENTATION "urn:3gpp:video-orientation" |
a=extmap:4 urn:3gpp:video-orientation
#define RTP_AUDIO_SKEW_TH_MS 120 |
#define RTP_HEADER_SIZE 12 |
#define RTP_VIDEO_SKEW_TH_MS 120 |
#define SKEW_DETECTION_WAIT_TIME_SECS 10 |
typedef enum janus_audiocodec janus_audiocodec |
typedef rtp_header janus_rtp_header |
typedef struct janus_rtp_header_extension janus_rtp_header_extension |
RTP extension.
typedef struct janus_rtp_packet janus_rtp_packet |
RTP packet.
typedef struct janus_rtp_simulcasting_context janus_rtp_simulcasting_context |
Helper struct for processing and tracking simulcast streams.
typedef struct janus_rtp_switching_context janus_rtp_switching_context |
RTP context, in order to make sure SSRC changes result in coherent seq/ts increases.
typedef enum janus_videocodec janus_videocodec |
typedef struct rtp_header rtp_header |
RTP Header (http://tools.ietf.org/html/rfc3550#section-5.1)
enum janus_audiocodec |
enum janus_videocodec |
janus_audiocodec janus_audiocodec_from_name | ( | const char * | name | ) |
const char* janus_audiocodec_name | ( | janus_audiocodec | acodec | ) |
int janus_audiocodec_pt | ( | janus_audiocodec | acodec | ) |
gboolean janus_is_rtp | ( | char * | buf, |
guint | len | ||
) |
Helper method to demultiplex RTP from other protocols.
[in] | buf | Buffer to inspect |
[in] | len | Length of the buffer to inspect |
const char* janus_rtp_header_extension_get_from_id | ( | const char * | sdp, |
int | id | ||
) |
Ugly and dirty helper to quickly get the RTP extension namespace associated with an id (extmap) in an SDP.
sdp | The SDP to parse |
id | The extension id to look for |
int janus_rtp_header_extension_get_id | ( | const char * | sdp, |
const char * | extension | ||
) |
Ugly and dirty helper to quickly get the id associated with an RTP extension (extmap) in an SDP.
sdp | The SDP to parse |
extension | The extension namespace to look for |
int janus_rtp_header_extension_parse_audio_level | ( | char * | buf, |
int | len, | ||
int | id, | ||
int * | level | ||
) |
Helper to parse a ssrc-audio-level RTP extension (https://tools.ietf.org/html/rfc6464)
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[in] | id | The extension ID to look for |
[out] | level | The level value in dBov (0=max, 127=min) |
int janus_rtp_header_extension_parse_playout_delay | ( | char * | buf, |
int | len, | ||
int | id, | ||
uint16_t * | min_delay, | ||
uint16_t * | max_delay | ||
) |
Helper to parse a playout-delay RTP extension (https://webrtc.org/experiments/rtp-hdrext/playout-delay)
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[in] | id | The extension ID to look for |
[out] | min_delay | The minimum delay value |
[out] | max_delay | The maximum delay value |
int janus_rtp_header_extension_parse_rtp_stream_id | ( | char * | buf, |
int | len, | ||
int | id, | ||
char * | sdes_item, | ||
int | sdes_len | ||
) |
Helper to parse a rtp-stream-id RTP extension (https://tools.ietf.org/html/draft-ietf-avtext-rid-09)
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[in] | id | The extension ID to look for |
[out] | sdes_item | Buffer where the RTP stream ID will be written |
[in] | sdes_len | Size of the input/output buffer |
int janus_rtp_header_extension_parse_transport_wide_cc | ( | char * | buf, |
int | len, | ||
int | id, | ||
uint16_t * | transSeqNum | ||
) |
Helper to parse a rtp-stream-id RTP extension (https://tools.ietf.org/html/draft-ietf-avtext-rid-09)
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[in] | id | The extension ID to look for |
[out] | transSeqNum | transport wide sequence number |
int janus_rtp_header_extension_parse_video_orientation | ( | char * | buf, |
int | len, | ||
int | id, | ||
gboolean * | c, | ||
gboolean * | f, | ||
gboolean * | r1, | ||
gboolean * | r0 | ||
) |
Helper to parse a video-orientation RTP extension (http://www.3gpp.org/ftp/Specs/html-info/26114.htm)
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[in] | id | The extension ID to look for |
[out] | c | The value of the Camera (C) bit |
[out] | f | The value of the Flip (F) bit |
[out] | r1 | The value of the first Rotation (R1) bit |
[out] | r0 | The value of the second Rotation (R0) bit |
void janus_rtp_header_update | ( | janus_rtp_header * | header, |
janus_rtp_switching_context * | context, | ||
gboolean | video, | ||
int | step | ||
) |
Use the context info to update the RTP header of a packet, if needed.
[in] | header | The RTP header to update |
[in] | context | The context to use as a reference |
[in] | video | Whether this is an audio or a video packet |
[in] | step | deprecated The expected timestamp step |
char* janus_rtp_payload | ( | char * | buf, |
int | len, | ||
int * | plen | ||
) |
Helper to quickly access the RTP payload, skipping header and extensions.
[in] | buf | The packet data |
[in] | len | The packet data length in bytes |
[out] | plen | The payload data length in bytes |
gboolean janus_rtp_simulcasting_context_process_rtp | ( | janus_rtp_simulcasting_context * | context, |
char * | buf, | ||
int | len, | ||
uint32_t * | ssrcs, | ||
janus_videocodec | vcodec, | ||
janus_rtp_switching_context * | sc | ||
) |
Process an RTP packet, and decide whether this should be relayed or not, updating the context accordingly.
changed_substream
, changed_temporal
and need_pli
properties, and updates them according to the decisions made after processinf the packet [in] | context | The simulcasting context to use |
[in] | buf | The RTP packet to process |
[in] | len | The length of the RTP packet (header, extension and payload) |
[in] | ssrcs | The simulcast SSRCs to refer to |
[in] | vcodec | Video codec of the RTP payload |
[in] | sc | RTP switching context to refer to, if any (only needed for VP8 and dropping temporal layers) |
void janus_rtp_simulcasting_context_reset | ( | janus_rtp_simulcasting_context * | context | ) |
Set (or reset) the context fields to their default values.
[in] | context | The context to (re)set |
int janus_rtp_skew_compensate_audio | ( | janus_rtp_header * | header, |
janus_rtp_switching_context * | context, | ||
gint64 | now | ||
) |
Use the context info to compensate for audio source skew, if needed.
[in] | header | The RTP header to update |
[in] | context | The context to use as a reference |
[in] | now | The packet arrival monotonic time |
int janus_rtp_skew_compensate_video | ( | janus_rtp_header * | header, |
janus_rtp_switching_context * | context, | ||
gint64 | now | ||
) |
Use the context info to compensate for video source skew, if needed.
[in] | header | The RTP header to update |
[in] | context | The context to use as a reference |
[in] | now | The packet arrival monotonic time |
void janus_rtp_switching_context_reset | ( | janus_rtp_switching_context * | context | ) |
Set (or reset) the context fields to their default values.
[in] | context | The context to (re)set |
janus_videocodec janus_videocodec_from_name | ( | const char * | name | ) |
const char* janus_videocodec_name | ( | janus_videocodec | vcodec | ) |
int janus_videocodec_pt | ( | janus_videocodec | vcodec | ) |