From 44be1cd2b6e9250c7754aed59f0f967060c723e0 Mon Sep 17 00:00:00 2001 From: Marco Bascetta Date: Mon, 22 Jan 2018 16:43:07 +0100 Subject: [PATCH 15/23] voip/audiostream, voip/mediastream: added 'audio_stream_new3' function that permits unidirectional audio streams. --- include/mediastreamer2/mediastream.h | 21 +++++++++++++++++++++ src/voip/audiostream.c | 6 +++++- src/voip/mediastream.c | 18 ++++++++++++++---- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/include/mediastreamer2/mediastream.h b/include/mediastreamer2/mediastream.h index b6232b6a..824fa053 100644 --- a/include/mediastreamer2/mediastream.h +++ b/include/mediastreamer2/mediastream.h @@ -506,6 +506,17 @@ MS2_PUBLIC AudioStream *audio_stream_new(MSFactory* factory, int loc_rtp_port, i **/ MS2_PUBLIC AudioStream *audio_stream_new2(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port); +/** + * Creates an AudioStream object listening on a RTP port for a dedicated address. + * @param loc_ip the local ip to listen for RTP packets. Can be ::, O.O.O.O or any ip4/6 addresses + * @param loc_rtp_port the local UDP port to listen for RTP packets. + * @param loc_rtcp_port the local UDP port to listen for RTCP packets + * @param factory the MSFActory from the core object + * @param rtp_sess_mode RTP session type (RTP_SESSION_SENDONLY, RTP_SESSION_RECVONLY, RTP_SESSION_SENDRECV) + * @return a new AudioStream. +**/ +MS2_PUBLIC AudioStream *audio_stream_new3(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port, RtpSessionMode rtp_sess_mode); + /**Creates an AudioStream object from initialized MSMediaStreamSessions. * @param sessions the MSMediaStreamSessions @@ -1211,6 +1222,16 @@ MS2_PUBLIC MSWebCamDesc *ms_mire_webcam_desc_get(void); /** + * Create an RTP session for sendonly, recvonly or duplex communication. + * @param[in] local_ip The local IP to bind the RTP and RTCP sockets to. + * @param[in] local_rtp_port The local port to bind the RTP socket to. + * @param[in] local_rtcp_port The local port to bind the RTCP socket to. + * @param[in] rtp_sess_mode The type of RTP session: RTP_SESSION_SENDONLY, RTP_SESSION_RECVONLY, RTP_SESSION_SENDRECV. + * @return Returns a new RTP session of specified mode. + */ +MS2_PUBLIC RtpSession * ms_create_rtp_session(const char* local_ip, int loc_rtp_port, int loc_rtcp_port, int mtu, RtpSessionMode rtp_sess_mode); + +/** * Create an RTP session for duplex communication. * @param[in] local_ip The local IP to bind the RTP and RTCP sockets to. * @param[in] local_rtp_port The local port to bind the RTP socket to. diff --git a/src/voip/audiostream.c b/src/voip/audiostream.c index ab7accac..c6bc93d8 100644 --- a/src/voip/audiostream.c +++ b/src/voip/audiostream.c @@ -1563,9 +1563,13 @@ AudioStream *audio_stream_new(MSFactory* factory, int loc_rtp_port, int loc_rtcp } AudioStream *audio_stream_new2(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port) { + return audio_stream_new3(factory, ip, loc_rtp_port, loc_rtcp_port, RTP_SESSION_SENDRECV); +} + +AudioStream *audio_stream_new3(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port, RtpSessionMode rtp_sess_mode) { AudioStream *obj; MSMediaStreamSessions sessions={0}; - sessions.rtp_session=ms_create_duplex_rtp_session(ip,loc_rtp_port,loc_rtcp_port, ms_factory_get_mtu(factory)); + sessions.rtp_session=ms_create_rtp_session(ip,loc_rtp_port,loc_rtcp_port, ms_factory_get_mtu(factory), rtp_sess_mode); obj=audio_stream_new_with_sessions(factory, &sessions); obj->ms.owns_sessions=TRUE; return obj; diff --git a/src/voip/mediastream.c b/src/voip/mediastream.c index d7fb82e5..df6cc931 100644 --- a/src/voip/mediastream.c +++ b/src/voip/mediastream.c @@ -127,16 +127,22 @@ void media_stream_init(MediaStream *stream, MSFactory *factory, const MSMediaStr , stream); } -RtpSession * ms_create_duplex_rtp_session(const char* local_ip, int loc_rtp_port, int loc_rtcp_port, int mtu) { +RtpSession * ms_create_rtp_session(const char* local_ip, int loc_rtp_port, int loc_rtcp_port, int mtu, RtpSessionMode rtp_sess_mode) { RtpSession *rtpr; - rtpr = rtp_session_new(RTP_SESSION_SENDRECV); + rtpr = rtp_session_new(rtp_sess_mode); rtp_session_set_recv_buf_size(rtpr, MAX(mtu , MS_MINIMAL_MTU)); rtp_session_set_scheduling_mode(rtpr, 0); rtp_session_set_blocking_mode(rtpr, 0); rtp_session_enable_adaptive_jitter_compensation(rtpr, TRUE); - rtp_session_set_symmetric_rtp(rtpr, TRUE); - rtp_session_set_local_addr(rtpr, local_ip, loc_rtp_port, loc_rtcp_port); + if (rtp_sess_mode == RTP_SESSION_SENDRECV) { + rtp_session_set_symmetric_rtp(rtpr, TRUE); + } else { + rtp_session_set_symmetric_rtp(rtpr, FALSE); + } + if (rtp_sess_mode != RTP_SESSION_SENDONLY) { + rtp_session_set_local_addr(rtpr, local_ip, loc_rtp_port, loc_rtcp_port); + } rtp_session_signal_connect(rtpr, "timestamp_jump", (RtpCallback)rtp_session_resync, NULL); rtp_session_signal_connect(rtpr, "ssrc_changed", (RtpCallback)rtp_session_resync, NULL); rtp_session_set_ssrc_changed_threshold(rtpr, 0); @@ -148,6 +154,10 @@ RtpSession * ms_create_duplex_rtp_session(const char* local_ip, int loc_rtp_port return rtpr; } +RtpSession * ms_create_duplex_rtp_session(const char* local_ip, int loc_rtp_port, int loc_rtcp_port, int mtu) { + return ms_create_rtp_session(local_ip, loc_rtp_port, loc_rtcp_port, mtu, RTP_SESSION_SENDRECV); +} + int media_stream_join_multicast_group(MediaStream *stream, const char *ip){ return rtp_session_join_multicast_group(stream->sessions.rtp_session,ip); } -- 2.11.0