Skip to content

Commit

Permalink
Added experimental support for repaired-rtp-stream-id extension as well
Browse files Browse the repository at this point in the history
  • Loading branch information
lminiero committed Mar 15, 2019
1 parent 79b1723 commit 5bbd6d4
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 18 deletions.
23 changes: 22 additions & 1 deletion ice.c
Original file line number Diff line number Diff line change
Expand Up @@ -2181,7 +2181,7 @@ static void janus_ice_cb_nice_recv(NiceAgent *agent, guint stream_id, guint comp
if(stream->rid[0] == NULL || stream->rid_ext_id < 1) {
stream->video_ssrc_peer[0] = packet_ssrc;
} else {
if(janus_rtp_header_extension_parse_rtp_stream_id(buf, len, stream->rid_ext_id, sdes_item, sizeof(sdes_item)) == 0) {
if(janus_rtp_header_extension_parse_rid(buf, len, stream->rid_ext_id, sdes_item, sizeof(sdes_item)) == 0) {
if(stream->rid[0] != NULL && !strcmp(stream->rid[0], sdes_item)) {
JANUS_LOG(LOG_VERB, "[%"SCNu64"] -- Simulcasting: rid=%s\n", handle->handle_id, sdes_item);
stream->video_ssrc_peer[0] = packet_ssrc;
Expand All @@ -2194,6 +2194,27 @@ static void janus_ice_cb_nice_recv(NiceAgent *agent, guint stream_id, guint comp
JANUS_LOG(LOG_VERB, "[%"SCNu64"] -- Simulcasting #2: rid=%s\n", handle->handle_id, sdes_item);
stream->video_ssrc_peer[2] = packet_ssrc;
vindex = 2;
} else if(stream->ridrtx_ext_id > 0 &&
janus_rtp_header_extension_parse_rid(buf, len, stream->ridrtx_ext_id, sdes_item, sizeof(sdes_item)) == 0) {
/* Try the repaired RTP stream ID */
if(stream->rid[0] != NULL && !strcmp(stream->rid[0], sdes_item)) {
JANUS_LOG(LOG_VERB, "[%"SCNu64"] -- Simulcasting: rid=%s (rtx)\n", handle->handle_id, sdes_item);
stream->video_ssrc_peer[0] = packet_ssrc;
vindex = 0;
rtx = 1;
} else if(stream->rid[1] != NULL && !strcmp(stream->rid[1], sdes_item)) {
JANUS_LOG(LOG_VERB, "[%"SCNu64"] -- Simulcasting #1: rid=%s (rtx)\n", handle->handle_id, sdes_item);
stream->video_ssrc_peer[1] = packet_ssrc;
vindex = 1;
rtx = 1;
} else if(stream->rid[2] != NULL && !strcmp(stream->rid[2], sdes_item)) {
JANUS_LOG(LOG_VERB, "[%"SCNu64"] -- Simulcasting #2: rid=%s (rtx)\n", handle->handle_id, sdes_item);
stream->video_ssrc_peer[2] = packet_ssrc;
vindex = 2;
rtx = 1;
} else {
JANUS_LOG(LOG_WARN, "[%"SCNu64"] -- Simulcasting: unknown rid %s..?\n", handle->handle_id, sdes_item);
}
} else {
JANUS_LOG(LOG_WARN, "[%"SCNu64"] -- Simulcasting: unknown rid %s..?\n", handle->handle_id, sdes_item);
}
Expand Down
4 changes: 2 additions & 2 deletions ice.h
Original file line number Diff line number Diff line change
Expand Up @@ -390,8 +390,8 @@ struct janus_ice_stream {
guint32 video_last_ts;
/*! \brief SDES mid RTP extension ID */
gint mid_ext_id;
/*! \brief RTP Stream extension ID */
gint rid_ext_id;
/*! \brief RTP Stream extension ID, and the related rtx one */
gint rid_ext_id, ridrtx_ext_id;
/*! \brief Whether we do transport wide cc for video */
gboolean do_transport_wide_cc;
/*! \brief Transport wide cc rtp ext ID */
Expand Down
6 changes: 4 additions & 2 deletions janus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1244,7 +1244,8 @@ int janus_process_incoming_request(janus_request *request) {
/* Check if the mid RTP extension is being negotiated */
handle->stream->mid_ext_id = janus_rtp_header_extension_get_id(jsep_sdp, JANUS_RTP_EXTMAP_MID);
/* Check if the RTP Stream ID extension is being negotiated */
handle->stream->rid_ext_id = janus_rtp_header_extension_get_id(jsep_sdp, JANUS_RTP_EXTMAP_RTP_STREAM_ID);
handle->stream->rid_ext_id = janus_rtp_header_extension_get_id(jsep_sdp, JANUS_RTP_EXTMAP_RID);
handle->stream->ridrtx_ext_id = janus_rtp_header_extension_get_id(jsep_sdp, JANUS_RTP_EXTMAP_REPAIRED_RID);
/* Check if transport wide CC is supported */
int transport_wide_cc_ext_id = janus_rtp_header_extension_get_id(jsep_sdp, JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC);
handle->stream->do_transport_wide_cc = transport_wide_cc_ext_id > 0 ? TRUE : FALSE;
Expand Down Expand Up @@ -2968,7 +2969,8 @@ json_t *janus_plugin_handle_sdp(janus_plugin_session *plugin_session, janus_plug
while(tempA) {
janus_sdp_attribute *a = (janus_sdp_attribute *)tempA->data;
if(a->name && a->value && (strstr(a->value, JANUS_RTP_EXTMAP_MID) ||
strstr(a->value, JANUS_RTP_EXTMAP_RTP_STREAM_ID))) {
strstr(a->value, JANUS_RTP_EXTMAP_RID) ||
strstr(a->value, JANUS_RTP_EXTMAP_REPAIRED_RID))) {
m->attributes = g_list_remove(m->attributes, a);
tempA = m->attributes;
janus_sdp_attribute_destroy(a);
Expand Down
3 changes: 2 additions & 1 deletion plugins/janus_echotest.c
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,8 @@ static void *janus_echotest_handler(void *data) {
JANUS_SDP_OA_AUDIO_FMTP, opus_fec ? "useinbandfec=1" : NULL,
JANUS_SDP_OA_VIDEO_CODEC, json_string_value(videocodec),
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_MID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RTP_STREAM_ID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_REPAIRED_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC,
JANUS_SDP_OA_DONE);
/* If we ended up sendonly, switch to inactive (as we don't really send anything ourselves) */
Expand Down
3 changes: 2 additions & 1 deletion plugins/janus_recordplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -1558,7 +1558,8 @@ static void *janus_recordplay_handler(void *data) {
JANUS_SDP_OA_VIDEO_DIRECTION, JANUS_SDP_RECVONLY,
JANUS_SDP_OA_DATA, FALSE,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_MID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RTP_STREAM_ID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_REPAIRED_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC,
JANUS_SDP_OA_DONE);
g_free(answer->s_name);
Expand Down
7 changes: 4 additions & 3 deletions plugins/janus_videoroom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1420,7 +1420,7 @@ typedef struct janus_videoroom_publisher {
gboolean do_opusfec; /* Whether this publisher is sending inband Opus FEC */
uint32_t ssrc[3]; /* Only needed in case VP8 (or H.264) simulcasting is involved */
char *rid[3]; /* Only needed if simulcasting is rid-based */
guint8 rid_extmap_id; /* rid extmap ID */
int rid_extmap_id; /* rid extmap ID */
guint8 audio_level_extmap_id; /* Audio level extmap ID */
guint8 video_orient_extmap_id; /* Video orientation extmap ID */
guint8 playout_delay_extmap_id; /* Playout delay extmap ID */
Expand Down Expand Up @@ -4068,7 +4068,7 @@ void janus_videoroom_incoming_rtp(janus_plugin_session *handle, int video, char
else if(participant->rid_extmap_id > 0) {
/* We may not know the SSRC yet, try the rid RTP extension */
char sdes_item[16];
if(janus_rtp_header_extension_parse_rtp_stream_id(buf, len, participant->rid_extmap_id, sdes_item, sizeof(sdes_item)) == 0) {
if(janus_rtp_header_extension_parse_rid(buf, len, participant->rid_extmap_id, sdes_item, sizeof(sdes_item)) == 0) {
if(participant->rid[0] != NULL && !strcmp(participant->rid[0], sdes_item)) {
participant->ssrc[0] = ssrc;
sc = 0;
Expand Down Expand Up @@ -5941,7 +5941,8 @@ static void *janus_videoroom_handler(void *data) {
JANUS_SDP_OA_VIDEO_CODEC, janus_videocodec_name(participant->vcodec),
JANUS_SDP_OA_VIDEO_DIRECTION, JANUS_SDP_RECVONLY,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_MID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RTP_STREAM_ID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, JANUS_RTP_EXTMAP_REPAIRED_RID,
JANUS_SDP_OA_ACCEPT_EXTMAP, videoroom->audiolevel_ext ? JANUS_RTP_EXTMAP_AUDIO_LEVEL : NULL,
JANUS_SDP_OA_ACCEPT_EXTMAP, videoroom->videoorient_ext ? JANUS_RTP_EXTMAP_VIDEO_ORIENTATION : NULL,
JANUS_SDP_OA_ACCEPT_EXTMAP, videoroom->playoutdelay_ext ? JANUS_RTP_EXTMAP_PLAYOUT_DELAY : NULL,
Expand Down
15 changes: 10 additions & 5 deletions rtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,12 @@ const char *janus_rtp_header_extension_get_from_id(const char *sdp, int id) {
return JANUS_RTP_EXTMAP_ABS_SEND_TIME;
if(strstr(extension, JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC))
return JANUS_RTP_EXTMAP_TRANSPORT_WIDE_CC;
if(strstr(extension, JANUS_RTP_EXTMAP_RTP_STREAM_ID))
return JANUS_RTP_EXTMAP_RTP_STREAM_ID;
if(strstr(extension, JANUS_RTP_EXTMAP_MID))
return JANUS_RTP_EXTMAP_MID;
if(strstr(extension, JANUS_RTP_EXTMAP_RID))
return JANUS_RTP_EXTMAP_RID;
if(strstr(extension, JANUS_RTP_EXTMAP_REPAIRED_RID))
return JANUS_RTP_EXTMAP_REPAIRED_RID;
JANUS_LOG(LOG_ERR, "Unsupported extension '%s'\n", extension);
return NULL;
}
Expand Down Expand Up @@ -242,12 +246,13 @@ int janus_rtp_header_extension_parse_mid(char *buf, int len, int id,
return 0;
}

int janus_rtp_header_extension_parse_rtp_stream_id(char *buf, int len, int id,
int janus_rtp_header_extension_parse_rid(char *buf, int len, int id,
char *sdes_item, int sdes_len) {
char *ext = NULL;
if(janus_rtp_header_extension_find(buf, len, id, NULL, NULL, &ext) < 0)
return -1;
/* a=extmap:3/sendonly urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id */
/* a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id */
/* a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id */
if(ext == NULL)
return -2;
int val_len = (*ext & 0x0F) + 1;
Expand Down Expand Up @@ -863,7 +868,7 @@ gboolean janus_rtp_simulcasting_context_process_rtp(janus_rtp_simulcasting_conte
if(context->rid_ext_id < 1 || rids == NULL)
return FALSE;
char sdes_item[16];
if(janus_rtp_header_extension_parse_rtp_stream_id(buf, len, context->rid_ext_id, sdes_item, sizeof(sdes_item)) != 0)
if(janus_rtp_header_extension_parse_rid(buf, len, context->rid_ext_id, sdes_item, sizeof(sdes_item)) != 0)
return FALSE;
if(rids[0] != NULL && !strcmp(rids[0], sdes_item)) {
JANUS_LOG(LOG_VERB, "Simulcasting: rid=%s --> ssrc=%"SCNu32"\n", sdes_item, ssrc);
Expand Down
8 changes: 5 additions & 3 deletions rtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,10 @@ typedef struct janus_rtp_header_extension {
#define JANUS_RTP_EXTMAP_PLAYOUT_DELAY "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"
/*! \brief a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid */
#define JANUS_RTP_EXTMAP_MID "urn:ietf:params:rtp-hdrext:sdes:mid"
/*! \brief a=extmap:3/sendonly urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id */
#define JANUS_RTP_EXTMAP_RTP_STREAM_ID "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
/*! \brief a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id */
#define JANUS_RTP_EXTMAP_RID "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
/*! \brief a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id */
#define JANUS_RTP_EXTMAP_REPAIRED_RID "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"

/*! \brief Helper method to demultiplex RTP from other protocols
* @param[in] buf Buffer to inspect
Expand Down Expand Up @@ -157,7 +159,7 @@ int janus_rtp_header_extension_parse_mid(char *buf, int len, int id,
* @param[out] sdes_item Buffer where the RTP stream ID will be written
* @param[in] sdes_len Size of the input/output buffer
* @returns 0 if found, -1 otherwise */
int janus_rtp_header_extension_parse_rtp_stream_id(char *buf, int len, int id,
int janus_rtp_header_extension_parse_rid(char *buf, int len, int id,
char *sdes_item, int sdes_len);

/*! \brief Helper to parse a transport wide sequence number (https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01)
Expand Down

0 comments on commit 5bbd6d4

Please sign in to comment.