From 2c28c1372195c226bf5d5a65fb2c069146ab043e Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Sat, 26 Sep 2015 12:29:57 +0200 Subject: [PATCH] Control: allow SSRC change of the RTP stream --- src/audio/audio.cpp | 17 +++++++++++++++++ src/control_socket.cpp | 5 ++++- src/messaging.h | 1 + src/video_rxtx/rtp.cpp | 20 ++++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 7441242e6..42fa4ac85 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -780,6 +780,23 @@ static struct response *audio_sender_process_message(struct state_audio *s, stru break; case SENDER_MSG_QUERY_VIDEO_MODE: return new_response(RESPONSE_BAD_REQUEST, NULL); + case SENDER_MSG_RESET_SSRC: + { + uint32_t old_ssrc = rtp_my_ssrc(s->audio_network_device); + auto old_devices = s->audio_network_device; + s->audio_network_device = + initialize_audio_network(&s->audio_network_parameters); + if (!s->audio_network_device) { + s->audio_network_device = old_devices; + log_msg(LOG_LEVEL_ERROR, "[control] Audio: Unable to change SSRC!\n"); + return new_response(RESPONSE_INT_SERV_ERR, NULL); + } else { + rtp_done(old_devices); + log_msg(LOG_LEVEL_NOTICE, "[control] Audio: changed SSRC from 0x%08lx to " + "0x%08lx.\n", old_ssrc, rtp_my_ssrc(s->audio_network_device)); + } + } + break; case SENDER_MSG_CHANGE_FEC: LOG(LOG_LEVEL_ERROR) << "Not implemented!\n"; return new_response(RESPONSE_NOT_IMPL, NULL); diff --git a/src/control_socket.cpp b/src/control_socket.cpp index 1a2f1247d..e4efad38b 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -327,7 +327,8 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s } } } else if(prefix_matches(message, "receiver ") || prefix_matches(message, "play") || - prefix_matches(message, "pause") || prefix_matches(message, "sender-port ")) { + prefix_matches(message, "pause") || prefix_matches(message, "sender-port ") || + prefix_matches(message, "reset-ssrc")) { struct msg_sender *msg = (struct msg_sender *) new_message(sizeof(struct msg_sender)); @@ -341,6 +342,8 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s msg->type = SENDER_MSG_PLAY; } else if(prefix_matches(message, "pause")) { msg->type = SENDER_MSG_PAUSE; + } else if(prefix_matches(message, "reset-ssrc")) { + msg->type = SENDER_MSG_RESET_SSRC; } else { abort(); } diff --git a/src/messaging.h b/src/messaging.h index a251fffee..806b48378 100644 --- a/src/messaging.h +++ b/src/messaging.h @@ -48,6 +48,7 @@ enum msg_sender_type { SENDER_MSG_PAUSE, SENDER_MSG_CHANGE_FEC, SENDER_MSG_QUERY_VIDEO_MODE, + SENDER_MSG_RESET_SSRC, }; struct msg_sender { diff --git a/src/video_rxtx/rtp.cpp b/src/video_rxtx/rtp.cpp index db0a136db..668e03f9f 100644 --- a/src/video_rxtx/rtp.cpp +++ b/src/video_rxtx/rtp.cpp @@ -156,6 +156,26 @@ struct response *rtp_video_rxtx::process_message(struct msg_sender *msg) return new_response(RESPONSE_OK, oss.str().c_str()); } break; + case SENDER_MSG_RESET_SSRC: + { + lock_guard lock(m_network_devices_lock); + uint32_t old_ssrc = rtp_my_ssrc(m_network_devices[0]); + auto old_devices = m_network_devices; + m_network_devices = initialize_network(m_requested_receiver.c_str(), + m_recv_port_number, + m_send_port_number, m_participants, m_ipv6, + m_requested_mcast_if); + if (!m_network_devices) { + m_network_devices = old_devices; + log_msg(LOG_LEVEL_ERROR, "[control] Unable to change SSRC!\n"); + return new_response(RESPONSE_INT_SERV_ERR, NULL); + } else { + destroy_rtp_devices(old_devices); + log_msg(LOG_LEVEL_NOTICE, "[control] Changed SSRC from 0x%08lx to " + "0x%08lx.\n", old_ssrc, rtp_my_ssrc(m_network_devices[0])); + } + } + break; } return new_response(RESPONSE_OK, NULL);