Skip to content

Commit

Permalink
Updated simulcast fallback in SIP, SIPre and NoSIP plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
lminiero committed Mar 18, 2019
1 parent 13ad484 commit ea4cdb3
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
21 changes: 21 additions & 0 deletions plugins/janus_nosip.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ typedef struct janus_nosip_media {
int local_video_rtp_port, remote_video_rtp_port;
int local_video_rtcp_port, remote_video_rtcp_port;
guint32 video_ssrc, video_ssrc_peer;
guint32 simulcast_ssrc;
int video_pt;
const char *video_pt_name;
srtp_t video_srtp_in, video_srtp_out;
Expand Down Expand Up @@ -830,6 +831,7 @@ void janus_nosip_create_session(janus_plugin_session *handle, int *error) {
session->media.remote_video_rtcp_port = 0;
session->media.video_ssrc = 0;
session->media.video_ssrc_peer = 0;
session->media.simulcast_ssrc = 0;
session->media.video_pt = -1;
session->media.video_pt_name = NULL;
session->media.video_send = TRUE;
Expand Down Expand Up @@ -970,6 +972,15 @@ void janus_nosip_incoming_rtp(janus_plugin_session *handle, int video, char *buf
/* Dropping packet, peer doesn't want to receive it */
return;
}
if(video && session->media.simulcast_ssrc) {
/* The user is simulcasting: drop everything except the base layer */
janus_rtp_header *header = (janus_rtp_header *)buf;
uint32_t ssrc = ntohl(header->ssrc);
if(ssrc != session->media.simulcast_ssrc) {
JANUS_LOG(LOG_DBG, "Dropping packet (not base simulcast substream)\n");
return;
}
}
if((video && session->media.video_ssrc == 0) || (!video && session->media.audio_ssrc == 0)) {
rtp_header *header = (rtp_header *)buf;
if(video) {
Expand Down Expand Up @@ -1124,6 +1135,7 @@ static void janus_nosip_hangup_media_internal(janus_plugin_session *handle) {
return;
if(!g_atomic_int_compare_and_exchange(&session->hangingup, 0, 1))
return;
session->media.simulcast_ssrc = 0;
/* Notify the thread that it's time to go */
if(session->media.pipefd[1] > 0) {
int code = 1;
Expand Down Expand Up @@ -1354,6 +1366,14 @@ static void *janus_nosip_handler(void *data) {
json_object_set_new(info, "sdp", json_string(sdp));
gateway->notify_event(&janus_nosip_plugin, session->handle, info);
}
/* If the user negotiated simulcasting, just stick with the base substream */
json_t *msg_simulcast = json_object_get(msg->jsep, "simulcast");
if(msg_simulcast) {
JANUS_LOG(LOG_WARN, "Client negotiated simulcasting which we don't do here, falling back to base substream...\n");
json_t *s = json_object_get(msg_simulcast, "ssrcs");
if(s && json_array_size(s) > 0)
session->media.simulcast_ssrc = json_integer_value(json_array_get(s, 0));
}
/* Send the barebone SDP back */
result = json_object();
json_object_set_new(result, "event", json_string("generated"));
Expand Down Expand Up @@ -2032,6 +2052,7 @@ static void janus_nosip_media_cleanup(janus_nosip_session *session) {
session->media.local_video_rtp_port = 0;
session->media.local_video_rtcp_port = 0;
session->media.video_ssrc = 0;
session->media.simulcast_ssrc = 0;
if(session->media.pipefd[0] > 0) {
close(session->media.pipefd[0]);
session->media.pipefd[0] = -1;
Expand Down
8 changes: 6 additions & 2 deletions plugins/janus_sip.c
Original file line number Diff line number Diff line change
Expand Up @@ -2529,7 +2529,9 @@ static void *janus_sip_handler(void *data) {
json_t *msg_simulcast = json_object_get(msg->jsep, "simulcast");
if(msg_simulcast) {
JANUS_LOG(LOG_WARN, "Client negotiated simulcasting which we don't do here, falling back to base substream...\n");
session->media.simulcast_ssrc = json_integer_value(json_object_get(msg_simulcast, "ssrc-0"));
json_t *s = json_object_get(msg_simulcast, "ssrcs");
if(s && json_array_size(s) > 0)
session->media.simulcast_ssrc = json_integer_value(json_array_get(s, 0));
}
/* Check if there are new credentials to authenticate the INVITE */
if(authuser) {
Expand Down Expand Up @@ -2685,7 +2687,9 @@ static void *janus_sip_handler(void *data) {
json_t *msg_simulcast = json_object_get(msg->jsep, "simulcast");
if(msg_simulcast) {
JANUS_LOG(LOG_WARN, "Client negotiated simulcasting which we don't do here, falling back to base substream...\n");
session->media.simulcast_ssrc = json_integer_value(json_object_get(msg_simulcast, "ssrc-0"));
json_t *s = json_object_get(msg_simulcast, "ssrcs");
if(s && json_array_size(s) > 0)
session->media.simulcast_ssrc = json_integer_value(json_array_get(s, 0));
}
/* Also notify event handlers */
if(notify_events && gateway->events_is_enabled()) {
Expand Down
29 changes: 29 additions & 0 deletions plugins/janus_sipre.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ typedef struct janus_sipre_media {
int local_video_rtp_port, remote_video_rtp_port;
int local_video_rtcp_port, remote_video_rtcp_port;
guint32 video_ssrc, video_ssrc_peer;
guint32 simulcast_ssrc;
int video_pt;
const char *video_pt_name;
srtp_t video_srtp_in, video_srtp_out;
Expand Down Expand Up @@ -1285,6 +1286,7 @@ void janus_sipre_create_session(janus_plugin_session *handle, int *error) {
session->media.remote_video_rtcp_port = 0;
session->media.video_ssrc = 0;
session->media.video_ssrc_peer = 0;
session->media.simulcast_ssrc = 0;
session->media.video_pt = -1;
session->media.video_pt_name = NULL;
session->media.video_send = TRUE;
Expand Down Expand Up @@ -1438,6 +1440,15 @@ void janus_sipre_incoming_rtp(janus_plugin_session *handle, int video, char *buf
/* Dropping packet, peer doesn't want to receive it */
return;
}
if(video && session->media.simulcast_ssrc) {
/* The user is simulcasting: drop everything except the base layer */
janus_rtp_header *header = (janus_rtp_header *)buf;
uint32_t ssrc = ntohl(header->ssrc);
if(ssrc != session->media.simulcast_ssrc) {
JANUS_LOG(LOG_DBG, "Dropping packet (not base simulcast substream)\n");
return;
}
}
if((video && session->media.video_ssrc == 0) || (!video && session->media.audio_ssrc == 0)) {
rtp_header *header = (rtp_header *)buf;
if(video) {
Expand Down Expand Up @@ -1600,6 +1611,7 @@ static void janus_sipre_hangup_media_internal(janus_plugin_session *handle) {
return;
if(!g_atomic_int_compare_and_exchange(&session->hangingup, 0, 1))
return;
session->media.simulcast_ssrc = 0;
/* Do cleanup if media thread has not been created */
if(!session->media.ready && !session->relayer_thread) {
janus_sipre_media_cleanup(session);
Expand Down Expand Up @@ -2095,6 +2107,14 @@ static void *janus_sipre_handler(void *data) {
json_object_set_new(info, "sdp", json_string(sdp));
gateway->notify_event(&janus_sipre_plugin, session->handle, info);
}
/* If the user negotiated simulcasting, just stick with the base substream */
json_t *msg_simulcast = json_object_get(msg->jsep, "simulcast");
if(msg_simulcast) {
JANUS_LOG(LOG_WARN, "Client negotiated simulcasting which we don't do here, falling back to base substream...\n");
json_t *s = json_object_get(msg_simulcast, "ssrcs");
if(s && json_array_size(s) > 0)
session->media.simulcast_ssrc = json_integer_value(json_array_get(s, 0));
}
/* Check if there are new credentials to authenticate the INVITE */
if(authuser) {
JANUS_LOG(LOG_VERB, "Updating credentials (authuser) for authenticating the INVITE\n");
Expand Down Expand Up @@ -2228,6 +2248,14 @@ static void *janus_sipre_handler(void *data) {
janus_sdp_destroy(session->sdp);
session->sdp = parsed_sdp;
JANUS_LOG(LOG_VERB, "Prepared SDP for 200 OK:\n%s", sdp);
/* If the user negotiated simulcasting, just stick with the base substream */
json_t *msg_simulcast = json_object_get(msg->jsep, "simulcast");
if(msg_simulcast) {
JANUS_LOG(LOG_WARN, "Client negotiated simulcasting which we don't do here, falling back to base substream...\n");
json_t *s = json_object_get(msg_simulcast, "ssrcs");
if(s && json_array_size(s) > 0)
session->media.simulcast_ssrc = json_integer_value(json_array_get(s, 0));
}
/* Also notify event handlers */
if(notify_events && gateway->events_is_enabled()) {
json_t *info = json_object();
Expand Down Expand Up @@ -3178,6 +3206,7 @@ static void janus_sipre_media_cleanup(janus_sipre_session *session) {
session->media.local_video_rtp_port = 0;
session->media.local_video_rtcp_port = 0;
session->media.video_ssrc = 0;
session->media.simulcast_ssrc = 0;
if(session->media.pipefd[0] > 0) {
close(session->media.pipefd[0]);
session->media.pipefd[0] = -1;
Expand Down

0 comments on commit ea4cdb3

Please sign in to comment.