From f85f1a4294048a060495a6333bb10b5167919223 Mon Sep 17 00:00:00 2001 From: Marco Bascetta Date: Wed, 24 Jan 2018 09:02:27 +0100 Subject: [PATCH 18/23] tools/mediastream: changed --local parameter parsing in order to specify bind interface. --- tools/mediastream.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/tools/mediastream.c b/tools/mediastream.c index 5fdc77b8..c1574ce9 100644 --- a/tools/mediastream.c +++ b/tools/mediastream.c @@ -97,6 +97,7 @@ typedef struct _MediastreamIceCandidate { typedef struct _MediastreamDatas { MSFactory *factory; int localport,remoteport,payload; + char localip[64]; char ip[64]; char *send_fmtp; char *recv_fmtp; @@ -184,8 +185,10 @@ static void parse_events(RtpSession *session, OrtpEvQueue *q); static bool_t parse_window_ids(const char *ids, int* video_id, int* preview_id); static RcAlgo parse_rc_algo(const char *algo); -const char *usage="mediastream --local \n" - "--remote \n" +static RtpSessionMode get_rtp_session_mode(MediastreamDatas* args); + +const char *usage="mediastream [--local ]\n" + "[--remote ]\n" "[--help (display this help) ]\n" "[--payload ]\n" "[ --agc (enable automatic gain control) ]\n" @@ -300,6 +303,7 @@ MediastreamDatas* init_default_args(void) { args->localport=0; args->remoteport=0; args->payload=0; + memset(args->localip, 0, sizeof(args->localip)); memset(args->ip, 0, sizeof(args->ip)); args->send_fmtp=NULL; args->recv_fmtp=NULL; @@ -375,12 +379,16 @@ bool_t parse_args(int argc, char** argv, MediastreamDatas* out) { if (strcmp(argv[i],"--help")==0 || strcmp(argv[i],"-h")==0) { return FALSE; }else if (strcmp(argv[i],"--local")==0){ - char *is_invalid; i++; - out->localport = strtol(argv[i],&is_invalid,10); - if (*is_invalid!='\0'){ - ms_error("Failed to parse local port '%s'\n",argv[i]); - return 0; + if (strlen(argv[i]) == 0) { + memset(out->localip, 0, sizeof(out->localip)); + ms_message("Local addr: NULL\n"); + } else { + if (!parse_addr(argv[i],out->localip,sizeof(out->localip),&out->localport)) { + ms_error("Failed to parse local address '%s'\n",argv[i]); + return FALSE; + } + ms_message("Local addr: ip=%s port=%i\n",out->localip,out->localport); } }else if (strcmp(argv[i],"--remote")==0){ i++; @@ -692,6 +700,29 @@ static MSSndCard *get_sound_card(MSSndCardManager *manager, const char* card_nam return play; } +static RtpSessionMode get_rtp_session_mode(MediastreamDatas* args) { + RtpSessionMode rtp_sess_mode = RTP_SESSION_SENDRECV; + + if (args->localip == NULL || (strlen(args->localip) == 0)) { + if (args->ip != NULL && (strlen(args->ip) > 0)) { + rtp_sess_mode = RTP_SESSION_SENDONLY; + ms_message("Starting RTP session SEND only\n"); + } else { + ms_fatal("Local and remote IP cannot be both NULL"); + } + } else { + if (args->ip == NULL || (strlen(args->ip) == 0)) { + rtp_sess_mode = RTP_SESSION_RECVONLY; + ms_message("Starting RTP session RECV only\n"); + } else { + rtp_sess_mode = RTP_SESSION_SENDRECV; + ms_message("Starting RTP DUPLEX session only\n"); + } + } + + return rtp_sess_mode; +} + void setup_media_streams(MediastreamDatas* args) { /*create the rtp session */ #ifdef VIDEO_ENABLED -- 2.11.0