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