Fork me on GitHub
Loading...
Searching...
No Matches
rtp.h
Go to the documentation of this file.
1
13#ifndef JANUS_RTP_H
14#define JANUS_RTP_H
15
16#include <arpa/inet.h>
17#if defined (__MACH__) || defined(__FreeBSD__)
18#include <machine/endian.h>
19#define __BYTE_ORDER BYTE_ORDER
20#define __BIG_ENDIAN BIG_ENDIAN
21#define __LITTLE_ENDIAN LITTLE_ENDIAN
22#else
23#include <endian.h>
24#endif
25#include <inttypes.h>
26#include <string.h>
27#include <glib.h>
28#include <jansson.h>
29
30#include "plugins/plugin.h"
31#include "utils.h"
32
33#define RTP_HEADER_SIZE 12
34
36typedef struct rtp_header
37{
38#if __BYTE_ORDER == __BIG_ENDIAN
39 uint16_t version:2;
40 uint16_t padding:1;
41 uint16_t extension:1;
42 uint16_t csrccount:4;
43 uint16_t markerbit:1;
44 uint16_t type:7;
45#elif __BYTE_ORDER == __LITTLE_ENDIAN
46 uint16_t csrccount:4;
47 uint16_t extension:1;
48 uint16_t padding:1;
49 uint16_t version:2;
50 uint16_t type:7;
51 uint16_t markerbit:1;
52#endif
53 uint16_t seq_number;
54 uint32_t timestamp;
55 uint32_t ssrc;
56 uint32_t csrc[16];
59
61typedef struct janus_rtp_packet {
62 char *data;
63 gint length;
64 gint64 created;
68
71 uint16_t type;
72 uint16_t length;
74
76#define JANUS_RTP_EXTMAP_AUDIO_LEVEL "urn:ietf:params:rtp-hdrext:ssrc-audio-level"
78#define JANUS_RTP_EXTMAP_TOFFSET "urn:ietf:params:rtp-hdrext:toffset"
80#define JANUS_RTP_EXTMAP_ABS_SEND_TIME "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"
82#define JANUS_RTP_EXTMAP_VIDEO_ORIENTATION "urn:3gpp:video-orientation"
84#define JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"
86#define JANUS_RTP_EXTMAP_PLAYOUT_DELAY "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"
88#define JANUS_RTP_EXTMAP_MID "urn:ietf:params:rtp-hdrext:sdes:mid"
90#define JANUS_RTP_EXTMAP_RID "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
92#define JANUS_RTP_EXTMAP_REPAIRED_RID "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"
94#define JANUS_RTP_EXTMAP_DEPENDENCY_DESC "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension"
96#define JANUS_RTP_EXTMAP_ENCRYPTED "urn:ietf:params:rtp-hdrext:encrypt"
97int janus_rtp_extension_id(const char *type);
98
99
100typedef enum janus_audiocodec {
113const char *janus_audiocodec_name(janus_audiocodec acodec);
116
117typedef enum janus_videocodec {
125const char *janus_videocodec_name(janus_videocodec vcodec);
128
129
133gboolean janus_is_rtp(char *buf, guint len);
134
140char *janus_rtp_payload(char *buf, int len, int *plen);
141
146int janus_rtp_header_extension_get_id(const char *sdp, const char *extension);
147
153const char *janus_rtp_header_extension_get_from_id(const char *sdp, int id);
154
164int janus_rtp_header_extension_parse_audio_level(char *buf, int len, int id, gboolean *vad, int *level);
165
175int janus_rtp_header_extension_parse_video_orientation(char *buf, int len, int id,
176 gboolean *c, gboolean *f, gboolean *r1, gboolean *r0);
177
185int janus_rtp_header_extension_parse_playout_delay(char *buf, int len, int id,
186 uint16_t *min_delay, uint16_t *max_delay);
187
195int janus_rtp_header_extension_parse_mid(char *buf, int len, int id,
196 char *sdes_item, int sdes_len);
197
205int janus_rtp_header_extension_parse_rid(char *buf, int len, int id,
206 char *sdes_item, int sdes_len);
207
215int janus_rtp_header_extension_parse_dependency_desc(char *buf, int len, int id,
216 uint8_t *dd_item, int *dd_len);
217
224int janus_rtp_header_extension_parse_abs_sent_time(char *buf, int len, int id, uint32_t *abs_ts);
225
232int janus_rtp_header_extension_set_abs_send_time(char *buf, int len, int id, uint32_t abs_ts);
233
240int janus_rtp_header_extension_parse_transport_wide_cc(char *buf, int len, int id, uint16_t *transSeqNum);
241
248int janus_rtp_header_extension_set_transport_wide_cc(char *buf, int len, int id, uint16_t transSeqNum);
249
257int janus_rtp_header_extension_replace_id(char *buf, int len, int id, int new_id);
258
268
272
278void janus_rtp_header_update(janus_rtp_header *header, janus_rtp_switching_context *context, gboolean video, int step);
279
280#define RTP_AUDIO_SKEW_TH_MS 120
281#define RTP_VIDEO_SKEW_TH_MS 120
282#define SKEW_DETECTION_WAIT_TIME_SECS 10
283
296
297
301
322 gboolean need_pli;
324
328
335void janus_rtp_simulcasting_prepare(json_t *simulcast, int *rid_ext_id, uint32_t *ssrcs, char **rids);
336
343void janus_rtp_simulcasting_cleanup(int *rid_ext_id, uint32_t *ssrcs, char **rids, janus_mutex *rid_mutex);
344
358 char *buf, int len, uint32_t *ssrcs, char **rids,
361
365
366typedef struct janus_rtp_svc_context {
384 gboolean need_pli;
386
390
401gboolean janus_rtp_svc_context_process_rtp(janus_rtp_svc_context *context, char *buf, int len,
404
408
409typedef struct janus_av1_svc_context {
411 uint8_t tcnt;
413 uint8_t tioff;
415 GHashTable *templates;
419 gboolean updated;
421
427 uint8_t id;
433
437
449 uint8_t *dd, int dd_len, uint8_t *template_id);
451
452
453#endif
GMutex janus_mutex
Janus mutex implementation.
Definition: mutex.h:73
Plugin-Core communication (implementation)
struct json_t json_t
Definition: plugin.h:236
const char * janus_videocodec_name(janus_videocodec vcodec)
Definition: rtp.c:967
int janus_rtp_header_extension_set_abs_send_time(char *buf, int len, int id, uint32_t abs_ts)
Helper to set an abs-send-time RTP extension (http://www.webrtc.org/experiments/rtp-hdrext/abs-send-t...
Definition: rtp.c:352
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.
Definition: rtp.c:497
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.
Definition: rtp.c:727
void janus_av1_svc_context_reset(janus_av1_svc_context *context)
Set (or reset) the context fields to their default values.
Definition: rtp.c:1383
void janus_rtp_switching_context_reset(janus_rtp_switching_context *context)
Set (or reset) the context fields to their default values.
Definition: rtp.c:490
janus_audiocodec
Definition: rtp.h:100
@ JANUS_AUDIOCODEC_PCMU
Definition: rtp.h:105
@ JANUS_AUDIOCODEC_MULTIOPUS
Definition: rtp.h:103
@ JANUS_AUDIOCODEC_L16_48K
Definition: rtp.h:110
@ JANUS_AUDIOCODEC_OPUSRED
Definition: rtp.h:104
@ JANUS_AUDIOCODEC_NONE
Definition: rtp.h:101
@ JANUS_AUDIOCODEC_ISAC_32K
Definition: rtp.h:108
@ JANUS_AUDIOCODEC_L16_16K
Definition: rtp.h:111
@ JANUS_AUDIOCODEC_G722
Definition: rtp.h:107
@ JANUS_AUDIOCODEC_OPUS
Definition: rtp.h:102
@ JANUS_AUDIOCODEC_PCMA
Definition: rtp.h:106
@ JANUS_AUDIOCODEC_ISAC_16K
Definition: rtp.h:109
void janus_rtp_simulcasting_context_reset(janus_rtp_simulcasting_context *context)
Set (or reset) the context fields to their default values.
Definition: rtp.c:1022
janus_audiocodec janus_audiocodec_from_name(const char *name)
Definition: rtp.c:911
int janus_rtp_header_extension_parse_dependency_desc(char *buf, int len, int id, uint8_t *dd_item, int *dd_len)
Helper to parse a dependency descriptor RTP extension (https://aomediacodec.github....
Definition: rtp.c:312
void janus_rtp_simulcasting_cleanup(int *rid_ext_id, uint32_t *ssrcs, char **rids, janus_mutex *rid_mutex)
Helper method to cleanup some or all of the simulcasting info (rids and/or SSRCs) we may have prepare...
Definition: rtp.c:1063
int janus_rtp_header_extension_replace_id(char *buf, int len, int id, int new_id)
Helper to replace the ID of an RTP extension with a different one (e.g., to turn a repaired-rtp-strea...
Definition: rtp.c:400
gboolean janus_rtp_svc_context_process_rtp(janus_rtp_svc_context *context, char *buf, int len, janus_videocodec vcodec, janus_vp9_svc_info *info, janus_rtp_switching_context *sc)
Process an RTP packet, and decide whether this should be relayed or not, updating the context accordi...
Definition: rtp.c:1250
int janus_rtp_header_extension_set_transport_wide_cc(char *buf, int len, int id, uint16_t transSeqNum)
Helper to set a transport wide sequence number (https://tools.ietf.org/html/draft-holmer-rmcat-transp...
Definition: rtp.c:386
gboolean janus_rtp_simulcasting_context_process_rtp(janus_rtp_simulcasting_context *context, char *buf, int len, uint32_t *ssrcs, char **rids, janus_videocodec vcodec, janus_rtp_switching_context *sc, janus_mutex *rid_mutex)
Process an RTP packet, and decide whether this should be relayed or not, updating the context accordi...
Definition: rtp.c:1083
janus_videocodec
Definition: rtp.h:117
@ JANUS_VIDEOCODEC_NONE
Definition: rtp.h:118
@ JANUS_VIDEOCODEC_H264
Definition: rtp.h:121
@ JANUS_VIDEOCODEC_AV1
Definition: rtp.h:122
@ JANUS_VIDEOCODEC_VP9
Definition: rtp.h:120
@ JANUS_VIDEOCODEC_VP8
Definition: rtp.h:119
@ JANUS_VIDEOCODEC_H265
Definition: rtp.h:123
int janus_rtp_header_extension_parse_abs_sent_time(char *buf, int len, int id, uint32_t *abs_ts)
Helper to parse an abs-send-time RTP extension (http://www.webrtc.org/experiments/rtp-hdrext/abs-send...
Definition: rtp.c:335
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...
Definition: rtp.c:80
int janus_videocodec_pt(janus_videocodec vcodec)
Definition: rtp.c:1002
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-dela...
Definition: rtp.c:250
int janus_rtp_header_extension_parse_transport_wide_cc(char *buf, int len, int id, uint16_t *transSeqNum)
Helper to parse a transport wide sequence number (https://tools.ietf.org/html/draft-holmer-rmcat-tran...
Definition: rtp.c:366
gboolean janus_av1_svc_context_process_dd(janus_av1_svc_context *context, uint8_t *dd, int dd_len, uint8_t *template_id)
Process a Dependency Descriptor payload, updating the SVC context accordingly.
Definition: rtp.c:1392
char * janus_rtp_payload(char *buf, int len, int *plen)
Helper to quickly access the RTP payload, skipping header and extensions.
Definition: rtp.c:25
rtp_header janus_rtp_header
Definition: rtp.h:58
int janus_rtp_header_extension_parse_mid(char *buf, int len, int id, char *sdes_item, int sdes_len)
Helper to parse a sdes-mid RTP extension (https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-ne...
Definition: rtp.c:269
janus_videocodec janus_videocodec_from_name(const char *name)
Definition: rtp.c:986
int janus_rtp_header_extension_parse_rid(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)
Definition: rtp.c:290
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....
Definition: rtp.c:228
void janus_rtp_simulcasting_prepare(json_t *simulcast, int *rid_ext_id, uint32_t *ssrcs, char **rids)
Helper method to prepare the simulcasting info (rids and/or SSRCs) from the simulcast object the core...
Definition: rtp.c:1033
const char * janus_audiocodec_name(janus_audiocodec acodec)
Definition: rtp.c:882
int janus_audiocodec_pt(janus_audiocodec acodec)
Definition: rtp.c:937
gboolean janus_is_rtp(char *buf, guint len)
Helper method to demultiplex RTP from other protocols.
Definition: rtp.c:18
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.
Definition: rtp.c:51
void janus_rtp_svc_context_reset(janus_rtp_svc_context *context)
Set (or reset) the context fields to their default values.
Definition: rtp.c:1241
int janus_rtp_header_extension_parse_audio_level(char *buf, int len, int id, gboolean *vad, int *level)
Helper to parse a ssrc-audio-level RTP extension (https://tools.ietf.org/html/rfc6464)
Definition: rtp.c:213
int janus_rtp_extension_id(const char *type)
Definition: rtp.c:465
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.
Definition: rtp.c:613
Helper struct for processing and tracking AV1-SVC streams.
Definition: rtp.h:409
uint8_t tcnt
Number of templates advertised via Dependency Descriptor.
Definition: rtp.h:411
int spatial_layers
How many spatial and temporal layers are available.
Definition: rtp.h:417
GHashTable * templates
Map of templates advertised via Dependency Descriptor, indexed by ID.
Definition: rtp.h:415
gboolean updated
Whether this context changed since the last update.
Definition: rtp.h:419
uint8_t tioff
Template ID offset, as advertised via Dependency Descriptor.
Definition: rtp.h:413
int temporal_layers
Definition: rtp.h:417
Helper struct to track SVC templates.
Definition: rtp.h:425
uint8_t id
Template ID.
Definition: rtp.h:427
int spatial
Spatial layer associated to this template.
Definition: rtp.h:429
int temporal
Temporal layer associated to this template.
Definition: rtp.h:431
Janus plugin RTP extensions.
Definition: plugin.h:558
RTP extension.
Definition: rtp.h:70
uint16_t length
Definition: rtp.h:72
uint16_t type
Definition: rtp.h:71
RTP packet.
Definition: rtp.h:61
char * data
Definition: rtp.h:62
gint64 last_retransmit
Definition: rtp.h:65
gint length
Definition: rtp.h:63
gint64 created
Definition: rtp.h:64
janus_plugin_rtp_extensions extensions
Definition: rtp.h:66
Helper struct for processing and tracking simulcast streams.
Definition: rtp.h:302
gboolean changed_temporal
Whether the temporal layer has changed after processing a packet.
Definition: rtp.h:320
int templayer_target
As above, but to handle transitions (e.g., wait for keyframe)
Definition: rtp.h:312
int substream_target
As above, but to handle transitions (e.g., wait for keyframe, or get this if available)
Definition: rtp.h:308
gint rid_ext_id
RTP Stream extension ID, if any.
Definition: rtp.h:304
gboolean changed_substream
Whether the substream has changed after processing a packet.
Definition: rtp.h:318
guint32 drop_trigger
How much time (in us, default 250000) without receiving packets will make us drop to the substream be...
Definition: rtp.h:314
int substream_target_temp
Definition: rtp.h:308
int templayer
Which simulcast temporal layer we should forward back.
Definition: rtp.h:310
int substream
Which simulcast substream we should forward back.
Definition: rtp.h:306
gboolean need_pli
Whether we need to send the user a keyframe request (PLI)
Definition: rtp.h:322
gint64 last_relayed
When we relayed the last packet (used to detect when substreams become unavailable)
Definition: rtp.h:316
Helper struct for processing and tracking VP9-SVC streams.
Definition: rtp.h:366
guint32 drop_trigger
How much time (in us, default 250000) without receiving packets will make us drop to the substream be...
Definition: rtp.h:376
gboolean changed_spatial
Whether the spatial layer has changed after processing a packet.
Definition: rtp.h:380
int temporal_target
As above, but to handle transitions (e.g., wait for keyframe)
Definition: rtp.h:374
gboolean changed_temporal
Whether the temporal layer has changed after processing a packet.
Definition: rtp.h:382
int temporal
Which SVC temporal layer we should forward back.
Definition: rtp.h:372
int spatial_target
As above, but to handle transitions (e.g., wait for keyframe, or get this if available)
Definition: rtp.h:370
int spatial
Which SVC spatial layer we should forward back.
Definition: rtp.h:368
gboolean need_pli
Whether we need to send the user a keyframe request (PLI)
Definition: rtp.h:384
gint64 last_spatial_layer[3]
When we relayed the last packet (used to detect when layers become unavailable)
Definition: rtp.h:378
RTP context, in order to make sure SSRC changes result in coherent seq/ts increases.
Definition: rtp.h:260
uint32_t prev_ts
Definition: rtp.h:261
uint32_t last_ssrc
Definition: rtp.h:261
gint64 reference_time
Definition: rtp.h:266
uint32_t start_ts
Definition: rtp.h:261
uint16_t base_seq
Definition: rtp.h:262
uint32_t target_ts
Definition: rtp.h:261
gint64 evaluating_start_time
Definition: rtp.h:266
gboolean ts_reset
Definition: rtp.h:263
uint32_t base_ts
Definition: rtp.h:261
uint16_t prev_seq
Definition: rtp.h:262
uint16_t last_seq
Definition: rtp.h:262
gboolean new_ssrc
Definition: rtp.h:263
gint32 prev_delay
Definition: rtp.h:265
gint32 active_delay
Definition: rtp.h:265
uint32_t last_ts
Definition: rtp.h:261
gint16 seq_offset
Definition: rtp.h:264
gint64 start_time
Definition: rtp.h:266
gint64 last_time
Definition: rtp.h:266
uint32_t base_ts_prev
Definition: rtp.h:261
gboolean seq_reset
Definition: rtp.h:263
uint16_t base_seq_prev
Definition: rtp.h:262
gint32 ts_offset
Definition: rtp.h:265
VP9 SVC info, as parsed from a payload descriptor.
Definition: utils.h:393
RTP Header (http://tools.ietf.org/html/rfc3550#section-5.1)
Definition: rtp.h:37
uint16_t extension
Definition: rtp.h:41
uint32_t timestamp
Definition: rtp.h:54
uint16_t padding
Definition: rtp.h:40
uint32_t csrc[16]
Definition: rtp.h:56
uint16_t csrccount
Definition: rtp.h:42
uint16_t type
Definition: rtp.h:44
uint32_t ssrc
Definition: rtp.h:55
uint16_t seq_number
Definition: rtp.h:53
uint16_t version
Definition: rtp.h:39
uint16_t markerbit
Definition: rtp.h:43
TURN REST API client.