]> sjero.net Git - linphone/commitdiff
choose video placement from linphonec
authorSimon Morlat <simon.morlat@linphone.org>
Thu, 16 Sep 2010 15:26:43 +0000 (17:26 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Thu, 16 Sep 2010 15:26:43 +0000 (17:26 +0200)
configure.in
console/commands.c
console/linphonec.c
console/linphonec.h
coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/private.h
coreapi/proxy.c

index c67f47ec818841db9e33f7bfa23d642bc2e04167..57862bdb25ff7d0e03b51fd2cabd593a5815906c 100644 (file)
@@ -294,7 +294,19 @@ AC_ARG_WITH( sdl,
                [  --with-sdl           Sets the installation prefix of libSDL, needed for video support. [default=/usr] ],
                [ libsdldir=${withval}],[ libsdldir=/usr ])
 
+AC_ARG_ENABLE(x11,
+                         [  --disable-x11    Disable X11 support],
+                         [case "${enableval}" in
+                         yes) enable_x11=true ;;
+                         no)  enable_x11=false ;;
+                         *) AC_MSG_ERROR(bad value ${enableval} for --disable-x11) ;;
+                         esac],[enable_x11=true])
+
 if test "$video" = "true"; then
+       
+       if test "$enable_x11" = "true"; then
+          AC_CHECK_HEADERS(X11/Xlib.h)
+       fi
        AC_DEFINE(VIDEO_ENABLED,1,[defined if video support is available])
 fi
 
index ca4c36ec462bc99b3c211e45f805ae04308704b2..9e37b3569da88d781d3f29aa4de06c2581f6852b 100644 (file)
@@ -90,6 +90,7 @@ static int lpc_cmd_mute_mic(LinphoneCore *lc, char *args);
 static int lpc_cmd_unmute_mic(LinphoneCore *lc, char *args);
 static int lpc_cmd_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, char *args);
 static int lpc_cmd_video_window(LinphoneCore *lc, char *args);
+static int lpc_cmd_states(LinphoneCore *lc, char *args);
 
 /* Command handler helpers */
 static void linphonec_proxy_add(LinphoneCore *lc);
@@ -118,6 +119,7 @@ static LPC_COMMAND *lpc_find_command(const char *name);
 
 void linphonec_out(const char *fmt,...);
 
+VideoParams lpc_video_params={-1,-1,-1,-1,TRUE};
 
 
 /***************************************************************************
@@ -130,7 +132,7 @@ void linphonec_out(const char *fmt,...);
  * Commands table.
  */
 static LPC_COMMAND commands[] = {
-       { "help", lpc_cmd_help, "Print commands help, 'help advanced' for advanced features.",
+       { "help", lpc_cmd_help, "Print commands help.",
                "'help <command>'\t: displays specific help for command.\n"
                "'help advanced'\t: shows advanced commands.\n"
        },
@@ -253,7 +255,17 @@ static LPC_COMMAND advanced_commands[] = {
                  "Set the rtp_no_xmit_on_audio_mute configuration parameter",
                  "   If set to 1 then rtp transmission will be muted when\n"
                  "   audio is muted , otherwise rtp is always sent."}, 
-       { "video-window", lpc_cmd_video_window, "Control video display window", NULL },
+       { "vwindow", lpc_cmd_video_window, "Control video display window",
+               "'vwindow show': shows video window\n"
+               "'vwindow hide': hides video window\n"
+               "'vwindow pos <x> <y>': Moves video window to x,y pixel coordinates\n"
+               "'vwindow size <width> <height>': Resizes video window"
+       },
+       { "states", lpc_cmd_states, "Show internal states of liblinphone, registrations and calls, according to linphonecore.h definitions",
+               "'states global': shows global state of liblinphone \n"
+               "'states calls': shows state of calls\n"
+               "'states proxies': shows state of proxy configurations"
+       },
        { "register", lpc_cmd_register, "Register in one line to a proxy" , "register <sip identity> <sip proxy> <password>"},
        { "unregister", lpc_cmd_unregister, "Unregister from default proxy", NULL       },
        { "status", lpc_cmd_status, "Print various status information", 
@@ -413,7 +425,7 @@ lpc_cmd_help(LinphoneCore *lc, char *arg)
                }
                
                linphonec_out("---------------------------\n");
-               linphonec_out("Type 'help <command>' for more details.\n");
+               linphonec_out("Type 'help <command>' for more details or 'help advanced' to list additional commands.\n");
 
                return 1;
        }
@@ -2155,9 +2167,88 @@ static int lpc_cmd_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, char *args)
 }
 
 static int lpc_cmd_video_window(LinphoneCore *lc, char *args){
+       char subcommand[64];
+       int a,b;
+       int err;
+#ifdef VIDEO_ENABLED
+       err=sscanf(args,"%s %i %i",subcommand,&a,&b);
+       if (err>=1){
+               if (strcmp(subcommand,"pos")==0){
+                       if (err<3) return 0;
+                       lpc_video_params.x=a;
+                       lpc_video_params.y=b;
+                       lpc_video_params.refresh=TRUE;
+               }else if (strcmp(subcommand,"size")==0){
+                       if (err<3) return 0;
+                       lpc_video_params.w=a;
+                       lpc_video_params.h=b;
+                       lpc_video_params.refresh=TRUE;
+               }else if (strcmp(subcommand,"show")==0){
+                       lpc_video_params.show=TRUE;
+                       lpc_video_params.refresh=TRUE;
+               }else if (strcmp(subcommand,"hide")==0){
+                       lpc_video_params.show=FALSE;
+                       lpc_video_params.refresh=TRUE;
+               }else return 0;
+       }
+#else
+       linphonec_out("Sorry, this version of linphonec wasn't compiled with video support.");
+#endif
        return 1;
 }
 
+static void lpc_display_global_state(LinphoneCore *lc){
+       linphonec_out("****************Global liblinphone state********************\n\t%s",
+                     linphone_global_state_to_string(linphone_core_get_global_state(lc)));
+}
+
+static void lpc_display_call_states(LinphoneCore *lc){
+       LinphoneCall *call;
+       const MSList *elem;
+       char *tmp;
+       linphonec_out("****************Calls states*******************************\nId    |            Destination         |      State\n");
+
+       for(elem=linphone_core_get_calls(lc);elem!=NULL;elem=elem->next){
+               call=(LinphoneCall*)elem->data;
+               tmp=linphone_call_get_remote_address_as_string (call);
+               linphonec_out("%2.2i|%10.10s|%s",(int)(long)linphone_call_get_user_pointer(call),
+                             tmp,linphone_call_state_to_string(linphone_call_get_state(call)));
+               ms_free(tmp);
+       }
+}
+
+static void lpc_display_proxy_states(LinphoneCore *lc){
+       const MSList *elem;
+       linphonec_out("****************Proxy registration states*****************\nIdentity      |      State\n");
+       for(elem=linphone_core_get_proxy_config_list (lc);elem!=NULL;elem=elem->next){
+               LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)elem->data;
+               linphonec_out("%20.10s | %s",linphone_proxy_config_get_identity (cfg),
+                             linphone_registration_state_to_string(linphone_proxy_config_get_state(cfg)));
+       }
+}
+
+static int lpc_cmd_states(LinphoneCore *lc, char *args){
+       if (args==NULL) {
+               lpc_display_global_state(lc);
+               lpc_display_call_states(lc);
+               lpc_display_proxy_states(lc);
+               return 1;
+       }
+       if (strcmp(args,"global")==0){
+               lpc_display_global_state(lc);
+               return 1;
+       }
+       if (strcmp(args,"proxies")==0){
+               lpc_display_proxy_states(lc);
+               return 1;
+       }
+       if (strcmp(args,"calls")==0){
+               lpc_display_call_states(lc);
+               return 1;
+       }
+       return 0;
+}
+
 /***************************************************************************
  *
  *  Command table management funx
index 75121db61bc1dfc8b1cd8fb7fd2e8a0d552b284f..7fcc0aa4993cdb9f1a7e1ebdea76265e402a8eae 100644 (file)
 #define PACKAGE_DIR ""
 #endif
 
+#ifdef HAVE_X11_XLIB_H
+#include <X11/Xlib.h>
+#include <SDL/SDL_syswm.h>
+#endif
+
 /***************************************************************************
  *
  *  Types
@@ -169,6 +174,8 @@ static ortp_pipe_t server_sock;
 #endif /*_WIN32_WCE*/
 
 
+extern VideoParams lpc_video_params;
+
 void linphonec_call_identify(LinphoneCall* call){
        static long callid=1;
        linphone_call_set_user_pointer (call,(void*)callid);
@@ -841,6 +848,66 @@ usage: linphonec [-c file] [-s sipaddr] [-a] [-V] [-d level ] [-l logfile]\n\
        exit(exit_status);
 }
 
+#ifdef VIDEO_ENABLED
+
+#ifdef HAVE_X11_XLIB_H
+static void sdl_x11_apply_video_params(){
+       static SDL_SysWMinfo info;
+       static bool_t wminfo_ready=FALSE;
+       
+       if ( !wminfo_ready){
+               SDL_VERSION(&info.version);
+               if ( SDL_GetWMInfo(&info) ) {
+                       if ( info.subsystem == SDL_SYSWM_X11 ) {
+                               wminfo_ready=TRUE;
+                       }
+               }
+       }
+       if ( !wminfo_ready) return;
+       
+       {
+               XWindowChanges wc;
+               unsigned int flags=0;
+               Display *display = info.info.x11.display;
+               Window window = info.info.x11.wmwindow;
+               
+               memset(&wc,0,sizeof(wc));
+               wc.x=lpc_video_params.x;
+               wc.y=lpc_video_params.y;
+               wc.width=lpc_video_params.w;
+               wc.height=lpc_video_params.h;
+               if (lpc_video_params.x!=-1 ){
+                       flags|=CWX|CWY;
+               }
+               if (lpc_video_params.w!=-1){
+                       flags|=CWWidth|CWHeight;
+               }
+               info.info.x11.lock_func();
+               XConfigureWindow(display,window,flags,&wc);
+               if (lpc_video_params.show)
+                       XMapWindow(display,window);
+               else
+                       XUnmapWindow(display,window);
+               info.info.x11.unlock_func();
+       }
+}
+#endif
+
+
+static void lpc_apply_video_params(){
+       if (lpc_video_params.refresh){
+               unsigned long wid=linphone_core_get_native_video_window_id (linphonec);
+               if (wid!=0){
+                       lpc_video_params.refresh=FALSE;
+#ifdef HAVE_X11_XLIB_H
+                       sdl_x11_apply_video_params();
+#endif
+               }
+       }
+}
+
+#endif
+
 
 /*
  *
@@ -882,6 +949,10 @@ linphonec_idle_call ()
 #endif
        }
 
+#ifdef VIDEO_ENABLED
+       lpc_apply_video_params();
+#endif
+
        return 0;
 }
 
index 235aa5e97addd36c5ddde04b44e2f58acff8f108..4a5844b56c4ab7859994a07eef28788b0d11d65a 100644 (file)
@@ -97,6 +97,12 @@ typedef struct {
        char *doc;              /* Long description.  */
 } LPC_COMMAND;
 
+typedef struct {
+       int x,y,w,h;
+       bool_t show;
+       bool_t refresh;
+} VideoParams;
+
 /***************************************************************************
  *
  *  Forward declarations
index eb55bb82239b337c269e891fe5ac0b07bc57b29d..e4e4b14f8bd097edd4f61aa588f01c456ac1bd9c 100644 (file)
@@ -3815,3 +3815,25 @@ PayloadType* linphone_core_find_payload_type(LinphoneCore* lc, const char* type,
        /*not found*/
        return NULL;
 }
+
+const char *linphone_global_state_to_string(LinphoneGlobalState gs){
+       switch(gs){
+               case LinphoneGlobalOff:
+                       return "LinphoneGlobalOff";
+               break;
+               case LinphoneGlobalOn:
+                       return "LinphoneGlobalOn";
+               break;
+               case LinphoneGlobalStartup:
+                       return "LinphoneGlobalStartup";
+               break;
+               case LinphoneGlobalShutdown:
+                       return "LinphoneGlobalShutdown";
+               break;
+       }
+       return NULL;
+}
+
+LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc){
+       return LinphoneGlobalOn;
+}
index 60714aa7c7322c1c0caceef52dc649283513343d..f577ae9859163357f18dd8e50aa2fae75c677445 100644 (file)
@@ -179,8 +179,10 @@ typedef enum _LinphoneCallState{
        LinphoneCallPausedByRemote
 } LinphoneCallState;
 
+const char *linphone_call_state_to_string(LinphoneCallState cs);
 
-enum _LinphoneCallState linphone_call_get_state(const LinphoneCall *call);
+
+LinphoneCallState linphone_call_get_state(const LinphoneCall *call);
 bool_t linphone_call_asked_to_autoanswer(LinphoneCall *call);
 const LinphoneAddress * linphone_core_get_current_call_remote_address(struct _LinphoneCore *lc);
 const LinphoneAddress * linphone_call_get_remote_address(const LinphoneCall *call);
@@ -265,6 +267,19 @@ bool_t linphone_friend_in_list(const LinphoneFriend *lf);
 **/
 typedef struct _LinphoneProxyConfig LinphoneProxyConfig;
 
+/**
+ * LinphoneRegistrationState describes proxy registration states.
+**/
+typedef enum _LinphoneRegistrationState{
+       LinphoneRegistrationNone,
+       LinphoneRegistrationProgress,
+       LinphoneRegistrationOk,
+       LinphoneRegistrationCleared,
+       LinphoneRegistrationFailed
+}LinphoneRegistrationState;
+
+const char *linphone_registration_state_to_string(LinphoneRegistrationState cs);
+
 LinphoneProxyConfig *linphone_proxy_config_new(void);
 int linphone_proxy_config_set_server_addr(LinphoneProxyConfig *obj, const char *server_addr);
 int linphone_proxy_config_set_identity(LinphoneProxyConfig *obj, const char *identity);
@@ -278,6 +293,7 @@ void linphone_proxy_config_enable_publish(LinphoneProxyConfig *obj, bool_t val);
 void linphone_proxy_config_set_dial_escape_plus(LinphoneProxyConfig *cfg, bool_t val);
 void linphone_proxy_config_set_dial_prefix(LinphoneProxyConfig *cfg, const char *prefix);
 
+LinphoneRegistrationState linphone_proxy_config_get_state(const LinphoneProxyConfig *obj);
 bool_t linphone_proxy_config_is_registered(const LinphoneProxyConfig *obj);
 const char *linphone_proxy_config_get_domain(const LinphoneProxyConfig *cfg);
 
@@ -391,13 +407,7 @@ typedef enum _LinphoneGlobalState{
        LinphoneGlobalShutdown
 }LinphoneGlobalState;
 
-typedef enum _LinphoneRegistrationState{
-       LinphoneRegistrationNone,
-       LinphoneRegistrationProgress,
-       LinphoneRegistrationOk,
-       LinphoneRegistrationCleared,
-       LinphoneRegistrationFailed
-}LinphoneRegistrationState;
+const char *linphone_global_state_to_string(LinphoneGlobalState gs);
 
 /**
  * @addtogroup initializing
@@ -830,6 +840,8 @@ int linphone_core_get_current_call_stats(LinphoneCore *lc, rtp_stats_t *local, r
 
 const MSList *linphone_core_get_calls(LinphoneCore *lc);
 
+LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc);
+
 #ifdef __cplusplus
 }
 #endif
index bbb48d0cb3d09a557421a97a72a9d22b2de76390..fdf9b1f33459aa0f61a2f4e2fc49a1726da8e9b4 100644 (file)
@@ -203,6 +203,7 @@ struct _LinphoneProxyConfig
        struct _SipSetupContext *ssctx;
        int auth_failures;
        char *dial_prefix;
+       LinphoneRegistrationState state;
        bool_t commit;
        bool_t reg_sendregister;
        bool_t registered;
index 848c8e4df2ce9ec6bff62ded6123695d332e880b..251bdbb13c1c390e25dfbf23c3b79cd41bd11791 100644 (file)
@@ -799,10 +799,35 @@ void * linphone_proxy_config_get_user_data(LinphoneProxyConfig *cr) {
 
 void linphone_proxy_config_set_state(LinphoneProxyConfig *cfg, LinphoneRegistrationState state, const char *message){
        LinphoneCore *lc=cfg->lc;
+       cfg->state=state;
        if (lc && lc->vtable.registration_state_changed){
                lc->vtable.registration_state_changed(lc,cfg,state,message);
        }
 }
 
+LinphoneRegistrationState linphone_proxy_config_get_state(const LinphoneProxyConfig *cfg){
+       return cfg->state;
+}
+
+ const char *linphone_registration_state_to_string(LinphoneRegistrationState cs){
+        switch(cs){
+               case LinphoneRegistrationCleared:
+                        return "LinphoneRegistrationCleared";
+               break;
+               case LinphoneRegistrationNone:
+                        return "LinphoneRegistrationNone";
+               break;
+               case LinphoneRegistrationProgress:
+                       return "LinphoneRegistrationProgress";
+               break;
+               case LinphoneRegistrationOk:
+                        return "LinphoneRegistrationOk";
+               break;
+               case LinphoneRegistrationFailed:
+                        return "LinphoneRegistrationFailed";
+               break;
+        }
+        return NULL;
+ }