diff --git a/linphone/coreapi/linphonecore.c b/linphone/coreapi/linphonecore.c index 5598f99c4..88a08e235 100644 --- a/linphone/coreapi/linphonecore.c +++ b/linphone/coreapi/linphonecore.c @@ -1423,6 +1423,7 @@ void linphone_core_start_media_streams(LinphoneCore *lc, LinphoneCall *call){ if (video_params->relay_session_id!=NULL) video_stream_set_relay_session_id(lc->videostream,video_params->relay_session_id); video_stream_set_sent_video_size(lc->videostream,linphone_core_get_preferred_video_size(lc)); + video_stream_enable_self_view(lc->videostream,lc->video_conf.selfview); if (lc->video_conf.display && lc->video_conf.capture) video_stream_start(lc->videostream, call->profile, video_params->remoteaddr, video_params->remoteport, @@ -2001,6 +2002,17 @@ bool_t linphone_core_video_preview_enabled(const LinphoneCore *lc){ return lc->video_conf.show_local; } +void linphone_core_enable_self_view(LinphoneCore *lc, bool_t val){ + lc->video_conf.selfview=val; + if (lc->videostream){ + video_stream_enable_self_view(lc->videostream,val); + } +} + +bool_t linphone_core_self_view_enabled(const LinphoneCore *lc){ + return lc->video_conf.selfview; +} + int linphone_core_set_video_device(LinphoneCore *lc, const char *id){ MSWebCam *olddev=lc->video_conf.device; if (id!=NULL){ diff --git a/linphone/coreapi/linphonecore.h b/linphone/coreapi/linphonecore.h index e2c246889..ef9db16fc 100644 --- a/linphone/coreapi/linphonecore.h +++ b/linphone/coreapi/linphonecore.h @@ -116,6 +116,7 @@ typedef struct video_config{ bool_t capture; bool_t show_local; bool_t display; + bool_t selfview; /*during calls*/ }video_config_t; typedef struct ui_config @@ -692,6 +693,8 @@ void linphone_core_set_preferred_video_size_by_name(LinphoneCore *lc, const char void linphone_core_enable_video_preview(LinphoneCore *lc, bool_t val); bool_t linphone_core_video_preview_enabled(const LinphoneCore *lc); +void linphone_core_enable_self_view(LinphoneCore *lc, bool_t val); +bool_t linphone_core_self_view_enabled(const LinphoneCore *lc); /* returns a null terminated static array of string describing the webcams */ diff --git a/linphone/gtk-glade/main.c b/linphone/gtk-glade/main.c index 83c1f6989..aa8978218 100644 --- a/linphone/gtk-glade/main.c +++ b/linphone/gtk-glade/main.c @@ -379,6 +379,11 @@ void linphone_gtk_set_audio_only(){ linphone_core_enable_video(linphone_gtk_get_core(),FALSE,FALSE); } +void linphone_gtk_enable_self_view(GtkWidget *w){ + linphone_core_enable_self_view(linphone_gtk_get_core(), + gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))); +} + void linphone_gtk_used_identity_changed(GtkWidget *w){ int active=gtk_combo_box_get_active(GTK_COMBO_BOX(w)); char *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w)); diff --git a/linphone/gtk-glade/main.glade b/linphone/gtk-glade/main.glade index 7b945f6e7..fc709a5cd 100644 --- a/linphone/gtk-glade/main.glade +++ b/linphone/gtk-glade/main.glade @@ -1,6 +1,6 @@ - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -93,6 +93,20 @@ + + + True + + + + + True + Enable self-view + True + True + + + @@ -398,235 +412,17 @@ Online users 4 True - + True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 - 0 - - - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - 0 - - - 1 - 2 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 3 - 0 - - - 2 - 3 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - A + D 0 3 4 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 4 - 0 - - - 1 - 2 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 5 - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 - 0 - - - 2 - 3 - 1 - 2 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - B - 0 - - - 3 - 4 - 1 - 2 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 7 - 0 - - - 2 - 3 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 8 - 0 - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 9 - 0 - - - 2 - 3 - 2 - 3 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - C - 0 - - - 3 - 4 - 2 - 3 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - * - 0 - - - 3 - 4 - - - - - - - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - 0 - - - 1 - 2 3 4 @@ -652,19 +448,237 @@ Online users - + True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - D + 0 + 0 + + + 1 + 2 + 3 + 4 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + * + 0 + + + 3 + 4 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + C 0 3 4 - 3 - 4 + 2 + 3 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 9 + 0 + + + 2 + 3 + 2 + 3 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 8 + 0 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 7 + 0 + + + 2 + 3 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + B + 0 + + + 3 + 4 + 1 + 2 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + 0 + + + 2 + 3 + 1 + 2 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + 0 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 4 + 0 + + + 1 + 2 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + A + 0 + + + 3 + 4 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 0 + + + 2 + 3 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 0 + + + 1 + 2 + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 1 + 0 + + diff --git a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h index b63f44613..f4a81c619 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h @@ -124,6 +124,7 @@ struct _VideoStream MSFilter *rtpsend; OrtpEvQueue *evq; MSVideoSize sent_vsize; + int corner; /*for selfview*/ bool_t adapt_bitrate; }; @@ -140,6 +141,7 @@ void video_stream_iterate(VideoStream *stream); void video_stream_send_vfu(VideoStream *stream); void video_stream_stop(VideoStream * stream); void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize); +void video_stream_enable_self_view(VideoStream *stream, bool_t val); VideoStream * video_preview_start(MSWebCam *device, MSVideoSize vsize); void video_preview_stop(VideoStream *stream); diff --git a/linphone/mediastreamer2/src/videostream.c b/linphone/mediastreamer2/src/videostream.c index 838b63db0..2bd79ab68 100644 --- a/linphone/mediastreamer2/src/videostream.c +++ b/linphone/mediastreamer2/src/videostream.c @@ -179,6 +179,13 @@ void video_stream_set_relay_session_id(VideoStream *stream, const char *id){ ms_filter_call_method(stream->rtpsend, MS_RTP_SEND_SET_RELAY_SESSION_ID,(void*)id); } +void video_stream_enable_self_view(VideoStream *stream, bool_t val){ + MSFilter *out=stream->output; + stream->corner=val ? 0 : -1; + if (out){ + ms_filter_call_method(out,MS_VIDEO_OUT_SET_CORNER,&stream->corner); + } +} void video_stream_enable_adaptive_bitrate_control(VideoStream *s, bool_t yesno){ s->adapt_bitrate=yesno; @@ -281,6 +288,7 @@ int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *re ms_filter_call_method(stream->output,MS_FILTER_SET_VIDEO_SIZE,&disp_size); ms_filter_call_method(stream->output,MS_VIDEO_OUT_AUTO_FIT,&tmp); ms_filter_call_method(stream->output,MS_FILTER_SET_PIX_FMT,&format); + ms_filter_call_method(stream->output,MS_VIDEO_OUT_SET_CORNER,&stream->corner); if (pt->recv_fmtp!=NULL) ms_filter_call_method(stream->decoder,MS_FILTER_ADD_FMTP,(void*)pt->recv_fmtp);