From fb113617c3e33e0c38fc78021385de6a661dd19b Mon Sep 17 00:00:00 2001 From: smorlat Date: Mon, 27 Oct 2008 12:43:40 +0000 Subject: [PATCH] support for large video formats bugfixing in SDL video output git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@120 3f6dc0c8-ddfe-455d-9043-3cd528dc4637 --- linphone/coreapi/linphonecore.c | 13 +- linphone/gtk-glade/parameters.glade | 496 +++++++++--------- linphone/gtk-glade/propertybox.c | 26 + linphone/mediastreamer2/acinclude.m4 | 17 +- .../include/mediastreamer2/mediastream.h | 17 +- .../include/mediastreamer2/msvideo.h | 23 +- .../include/mediastreamer2/msvideoout.h | 8 + .../plugins/msx264/src/msx264.c | 5 +- linphone/mediastreamer2/src/msvideo.c | 3 + linphone/mediastreamer2/src/videoenc.c | 9 +- linphone/mediastreamer2/src/videoout.c | 182 +++---- linphone/mediastreamer2/src/videostream.c | 53 +- linphone/mediastreamer2/tests/mediastream.c | 22 +- linphone/mediastreamer2/tests/videodisplay.c | 7 +- 14 files changed, 492 insertions(+), 389 deletions(-) diff --git a/linphone/coreapi/linphonecore.c b/linphone/coreapi/linphonecore.c index ea8d3f900..8115dd31a 100644 --- a/linphone/coreapi/linphonecore.c +++ b/linphone/coreapi/linphonecore.c @@ -1460,7 +1460,7 @@ void linphone_core_stop_media_streams(LinphoneCore *lc){ } if (linphone_core_video_preview_enabled(lc)){ if (lc->previewstream==NULL){ - lc->previewstream=video_preview_start(lc->video_conf.device); + lc->previewstream=video_preview_start(lc->video_conf.device, lc->video_conf.vsize); } } #endif @@ -1940,7 +1940,8 @@ static void toggle_video_preview(LinphoneCore *lc, bool_t val){ if (lc->videostream==NULL){ if (val){ if (lc->previewstream==NULL){ - lc->previewstream=video_preview_start(lc->video_conf.device); + lc->previewstream=video_preview_start(lc->video_conf.device, + lc->video_conf.vsize); } }else{ if (lc->previewstream!=NULL){ @@ -2045,8 +2046,14 @@ static bool_t video_size_supported(MSVideoSize vsize){ void linphone_core_set_preferred_video_size(LinphoneCore *lc, MSVideoSize vsize){ - if (video_size_supported(vsize)) + if (video_size_supported(vsize)){ + MSVideoSize oldvsize=lc->video_conf.vsize; lc->video_conf.vsize=vsize; + if (!ms_video_size_equal(oldvsize,vsize) && lc->previewstream!=NULL){ + toggle_video_preview(lc,FALSE); + toggle_video_preview(lc,TRUE); + } + } } void linphone_core_set_preferred_video_size_by_name(LinphoneCore *lc, const char *name){ diff --git a/linphone/gtk-glade/parameters.glade b/linphone/gtk-glade/parameters.glade index d8a63ace3..60539d71d 100644 --- a/linphone/gtk-glade/parameters.glade +++ b/linphone/gtk-glade/parameters.glade @@ -1,6 +1,6 @@ - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -118,48 +118,18 @@ 3 2 - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - SIP (UDP): - GTK_JUSTIFY_RIGHT - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Audio RTP/UDP: - GTK_JUSTIFY_RIGHT - - - 1 - 2 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Video RTP/UDP: - GTK_JUSTIFY_RIGHT - - - 2 - 3 - - - - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 1 65535 1 10 10 - + 1 2 + 2 + 3 @@ -178,20 +148,50 @@ - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 1 65535 1 10 10 - + 1 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Video RTP/UDP: + GTK_JUSTIFY_RIGHT + + 2 3 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Audio RTP/UDP: + GTK_JUSTIFY_RIGHT + + + 1 + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + SIP (UDP): + GTK_JUSTIFY_RIGHT + + @@ -397,145 +397,6 @@ - - - True - True - Enable echo cancellation - 0 - True - - - - 1 - 2 - 5 - 6 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - a sound card - - - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Playback device: - GTK_JUSTIFY_RIGHT - - - GTK_FILL - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Ring device: - GTK_JUSTIFY_RIGHT - - - 1 - 2 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Capture device: - GTK_JUSTIFY_RIGHT - - - 2 - 3 - GTK_FILL - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - ALSA special device (optional): - GTK_JUSTIFY_RIGHT - - - 3 - 4 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - default soundcard - - - - 1 - 2 - 1 - 2 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - default soundcard - - - - - 1 - 2 - 2 - 3 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - 1 - 2 - 3 - 4 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Ring sound: - GTK_JUSTIFY_RIGHT - - - 4 - 5 - GTK_FILL - - True @@ -571,6 +432,145 @@ GTK_FILL + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Ring sound: + GTK_JUSTIFY_RIGHT + + + 4 + 5 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + 1 + 2 + 3 + 4 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + default soundcard + + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + default soundcard + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + ALSA special device (optional): + GTK_JUSTIFY_RIGHT + + + 3 + 4 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Capture device: + GTK_JUSTIFY_RIGHT + + + 2 + 3 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Ring device: + GTK_JUSTIFY_RIGHT + + + 1 + 2 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Playback device: + GTK_JUSTIFY_RIGHT + + + GTK_FILL + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + a sound card + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + Enable echo cancellation + 0 + True + + + + 1 + 2 + 5 + 6 + + @@ -602,25 +602,13 @@ 2 2 - + True - + Video input device: + GTK_JUSTIFY_RIGHT - 1 - 2 - 1 - 2 - - - - - True - Prefered video resolution: - - - 1 - 2 + GTK_EXPAND @@ -636,13 +624,27 @@ - + True - Video input device: - GTK_JUSTIFY_RIGHT + Prefered video resolution: - GTK_EXPAND + 1 + 2 + + + + + True + 0 + CIF + + + + 1 + 2 + 1 + 2 @@ -720,15 +722,42 @@ 3 2 - + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Your display name (eg: John Doe): + + + + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False + 1 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Your username: + + + 1 + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Your resulting SIP address: + + 2 3 @@ -748,46 +777,19 @@ - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Your resulting SIP address: - - - 2 - 3 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Your username: - - - 1 - 2 - - - - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + False 1 2 + 2 + 3 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Your display name (eg: John Doe): - - @@ -1306,21 +1308,17 @@ Video codecs 2 2 - + True + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Download speed limit in Kbit/sec: - GTK_JUSTIFY_RIGHT - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Upload speed limit in Kbit/sec: - GTK_JUSTIFY_RIGHT + 0 stands for "unlimited" + 0 -1 100000 1 10 10 + + 1 + 2 1 2 @@ -1340,21 +1338,25 @@ Video codecs - + True - True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 stands for "unlimited" - 0 -1 100000 1 10 10 - + Upload speed limit in Kbit/sec: + GTK_JUSTIFY_RIGHT - 1 - 2 1 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Download speed limit in Kbit/sec: + GTK_JUSTIFY_RIGHT + + diff --git a/linphone/gtk-glade/propertybox.c b/linphone/gtk-glade/propertybox.c index da6b5d059..7cf5ae3c8 100644 --- a/linphone/gtk-glade/propertybox.c +++ b/linphone/gtk-glade/propertybox.c @@ -33,6 +33,23 @@ static void linphone_gtk_fill_combo_box(GtkWidget *combo, const char **devices, gtk_combo_box_set_active(GTK_COMBO_BOX(combo),active); } +void linphone_gtk_fill_video_sizes(GtkWidget *combo){ + const MSVideoSizeDef *def=linphone_core_get_supported_video_sizes(linphone_gtk_get_core());; + int i,active=0; + char vsize_def[256]; + MSVideoSize cur=linphone_core_get_preferred_video_size(linphone_gtk_get_core()); + /* glade creates a combo box without list model and text renderer, + unless we fill it with a dummy text. + This dummy text needs to be removed first*/ + gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0); + for(i=0;def->name!=NULL;++def,++i){ + snprintf(vsize_def,sizeof(vsize_def),"%s (%ix%i)",def->name,def->vsize.width,def->vsize.height); + gtk_combo_box_append_text(GTK_COMBO_BOX(combo),vsize_def); + if (cur.width==def->vsize.width && cur.height==def->vsize.height) active=i; + } + gtk_combo_box_set_active(GTK_COMBO_BOX(combo),active); +} + void linphone_gtk_parameters_closed(GtkWidget *button){ GtkWidget *pb=gtk_widget_get_toplevel(button); gtk_widget_destroy(pb); @@ -153,6 +170,14 @@ void linphone_gtk_cam_changed(GtkWidget *w){ g_free(sel); } +void linphone_gtk_video_size_changed(GtkWidget *w){ + int sel=gtk_combo_box_get_active(GTK_COMBO_BOX(w)); + const MSVideoSizeDef *defs=linphone_core_get_supported_video_sizes(linphone_gtk_get_core()); + if (defs<0) return; + linphone_core_set_preferred_video_size(linphone_gtk_get_core(), + defs[sel].vsize); +} + void linphone_gtk_ring_file_set(GtkWidget *w){ gchar *file=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(w)); linphone_core_set_ring(linphone_gtk_get_core(),file); @@ -623,6 +648,7 @@ void linphone_gtk_show_parameters(void){ linphone_core_get_capture_device(lc)); linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"webcams"),linphone_core_get_video_devices(lc), linphone_core_get_video_device(lc)); + linphone_gtk_fill_video_sizes(linphone_gtk_get_widget(pb,"video_size")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"echo_cancelation")), linphone_core_echo_cancelation_enabled(lc)); diff --git a/linphone/mediastreamer2/acinclude.m4 b/linphone/mediastreamer2/acinclude.m4 index 1798b3e8c..f7294c413 100644 --- a/linphone/mediastreamer2/acinclude.m4 +++ b/linphone/mediastreamer2/acinclude.m4 @@ -101,17 +101,24 @@ AC_DEFUN([MS_CHECK_VIDEO],[ PKG_CHECK_MODULES(SWSCALE, [libswscale >= 0.5.0 ], [echo "We have libswscale"], [echo "We don't have libswscale, let's hope its symbols are in libavcodec"] ) - MS_CHECK_DEP([SDL],[SDL],[${libsdldir}/include],[${libsdldir}/lib],[SDL/SDL.h],[SDL],[SDL_Init]) - if test "$SDL_found" = "no" ; then - AC_MSG_ERROR([Could not find libsdl headers and library. This is mandatory for video support]) + if test "$libsdldir" != "none" ; then + MS_CHECK_DEP([SDL],[SDL],[${libsdldir}/include],[${libsdldir}/lib],[SDL/SDL.h],[SDL],[SDL_Init]) + if test "$SDL_found" = "no" ; then + AC_MSG_ERROR([Could not find libsdl headers and library. This is mandatory for video support]) + fi fi PKG_CHECK_MODULES(THEORA, [theora >= 1.0alpha7 ], [have_theora=yes], [have_theora=no]) AC_CHECK_HEADERS(X11/Xlib.h) - VIDEO_CFLAGS=" $FFMPEG_CFLAGS $SDL_CFLAGS -DVIDEO_ENABLED " - VIDEO_LIBS=" $FFMPEG_LIBS $SWSCALE_LIBS $SDL_LIBS" + VIDEO_CFLAGS=" $FFMPEG_CFLAGS -DVIDEO_ENABLED" + VIDEO_LIBS=" $FFMPEG_LIBS $SWSCALE_LIBS" + + if test "$SDL_found" = "yes" ; then + VIDEO_CFLAGS="$VIDEO_CFLAGS $SDL_CFLAGS -DHAVE_SDL" + VIDEO_LIBS="$VIDEO_LIBS $SDL_LIBS" + fi if test "${ac_cv_header_X11_Xlib_h}" = "yes" ; then VIDEO_LIBS="$VIDEO_LIBS -lX11" diff --git a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h index 6f2f21eca..0bb7b6731 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/mediastream.h +++ b/linphone/mediastreamer2/include/mediastreamer2/mediastream.h @@ -21,10 +21,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef MEDIASTREAM_H #define MEDIASTREAM_H -#include "msfilter.h" -#include "msticker.h" -#include "mssndcard.h" -#include "mswebcam.h" +#include "mediastreamer2/msfilter.h" +#include "mediastreamer2/msticker.h" +#include "mediastreamer2/mssndcard.h" +#include "mediastreamer2/mswebcam.h" +#include "mediastreamer2/msvideo.h" #include "ortp/ortp.h" #include "ortp/event.h" @@ -119,11 +120,12 @@ struct _VideoStream MSFilter *rtprecv; MSFilter *rtpsend; OrtpEvQueue *evq; + MSVideoSize sent_vsize; bool_t adapt_bitrate; }; - typedef struct _VideoStream VideoStream; + VideoStream *video_stream_new(int locport, bool_t use_ipv6); void video_stream_enable_adaptive_bitrate_control(VideoStream *s, bool_t yesno); int video_stream_start(VideoStream * stream, RtpProfile *profile, const char *remip, int remport, int rem_rtcp_port, @@ -133,9 +135,10 @@ void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const /*function to call periodically to handle various events */ void video_stream_iterate(VideoStream *stream); void video_stream_send_vfu(VideoStream *stream); -void video_stream_stop (VideoStream * stream); +void video_stream_stop(VideoStream * stream); +void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize); -VideoStream * video_preview_start(MSWebCam *device); +VideoStream * video_preview_start(MSWebCam *device, MSVideoSize vsize); void video_preview_stop(VideoStream *stream); int video_stream_recv_only_start(VideoStream * stream, RtpProfile *profile, const char *remip, int remport, int payload, int jitt_comp); diff --git a/linphone/mediastreamer2/include/mediastreamer2/msvideo.h b/linphone/mediastreamer2/include/mediastreamer2/msvideo.h index a14b9d6fc..bed814e84 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/msvideo.h +++ b/linphone/mediastreamer2/include/mediastreamer2/msvideo.h @@ -48,11 +48,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MS_VIDEO_SIZE_1024_W 1024 #define MS_VIDEO_SIZE_1024_H 768 +#define MS_VIDEO_SIZE_800X600_W 800 +#define MS_VIDEO_SIZE_800X600_H 600 + #define MS_VIDEO_SIZE_MAX_W MS_VIDEO_SIZE_1024_W #define MS_VIDEO_SIZE_MAX_H MS_VIDEO_SIZE_1024_H typedef struct MSVideoSize{ - int width,height; + int16_t width,height; } MSVideoSize; typedef struct MSRect{ @@ -73,6 +76,24 @@ typedef struct MSRect{ #define MS_VIDEO_SIZE_1024 (MSVideoSize){MS_VIDEO_SIZE_1024_W, MS_VIDEO_SIZE_1024_H} +#define MS_VIDEO_SIZE_800X600 (MSVideoSize){MS_VIDEO_SIZE_800X600_W, MS_VIDEO_SIZE_800X600_H} + +static inline bool_t ms_video_size_greater_than(MSVideoSize vs1, MSVideoSize vs2){ + return (vs1.width>=vs2.width) && (vs1.height>=vs2.height); +} + +static inline MSVideoSize ms_video_size_max(MSVideoSize vs1, MSVideoSize vs2){ + return ms_video_size_greater_than(vs1,vs2) ? vs1 : vs2; +} + +static inline MSVideoSize ms_video_size_min(MSVideoSize vs1, MSVideoSize vs2){ + return ms_video_size_greater_than(vs1,vs2) ? vs2 : vs1; +} + +static inline bool_t ms_video_size_equal(MSVideoSize vs1, MSVideoSize vs2){ + return vs1.width==vs2.width && vs1.height==vs2.height; +} + typedef enum{ MS_YUV420P, MS_YUYV, diff --git a/linphone/mediastreamer2/include/mediastreamer2/msvideoout.h b/linphone/mediastreamer2/include/mediastreamer2/msvideoout.h index 0d2eee84d..2d1b1133e 100644 --- a/linphone/mediastreamer2/include/mediastreamer2/msvideoout.h +++ b/linphone/mediastreamer2/include/mediastreamer2/msvideoout.h @@ -45,6 +45,7 @@ typedef struct _MSDisplayDesc{ void (*update)(struct _MSDisplay *); /*display the picture to the screen*/ void (*uninit)(struct _MSDisplay *); bool_t (*pollevent)(struct _MSDisplay *, MSDisplayEvent *ev); + long default_window_id; }MSDisplayDesc; typedef struct _MSDisplay{ @@ -76,6 +77,12 @@ extern MSDisplayDesc ms_sdl_display_desc; extern "C"{ #endif +/*plugins can set their own display using this method:*/ +void ms_display_desc_set_default(MSDisplayDesc *desc); + +MSDisplayDesc * ms_display_desc_get_default(void); +void ms_display_desc_set_default_window_id(MSDisplayDesc *desc, long id); + MSVAR_DECLSPEC MSDisplayDesc ms_win_display_desc; MSDisplay *ms_display_new(MSDisplayDesc *desc); @@ -85,6 +92,7 @@ void ms_display_destroy(MSDisplay *d); #define MS_VIDEO_OUT_SET_DISPLAY MS_FILTER_METHOD(MS_VIDEO_OUT_ID,0,MSDisplay*) #define MS_VIDEO_OUT_HANDLE_RESIZING MS_FILTER_METHOD_NO_ARG(MS_VIDEO_OUT_ID,1) #define MS_VIDEO_OUT_SET_CORNER MS_FILTER_METHOD(MS_VIDEO_OUT_ID,2,int*) +#define MS_VIDEO_OUT_AUTO_FIT MS_FILTER_METHOD(MS_VIDEO_OUT_ID,3,int) #ifdef __cplusplus } diff --git a/linphone/mediastreamer2/plugins/msx264/src/msx264.c b/linphone/mediastreamer2/plugins/msx264/src/msx264.c index 705709a11..119b1f2a8 100644 --- a/linphone/mediastreamer2/plugins/msx264/src/msx264.c +++ b/linphone/mediastreamer2/plugins/msx264/src/msx264.c @@ -177,7 +177,10 @@ static int enc_set_br(MSFilter *f, void *arg){ EncData *d=(EncData*)f->data; d->bitrate=*(int*)arg; - if (d->bitrate>=1024000){ + if (d->bitrate>=1024000){ + d->vsize=MS_VIDEO_SIZE_VGA; + d->fps=25; + }else if (d->bitrate>=512000){ d->vsize=MS_VIDEO_SIZE_VGA; d->fps=15; }else if (d->bitrate>=384000){ diff --git a/linphone/mediastreamer2/src/msvideo.c b/linphone/mediastreamer2/src/msvideo.c index 6ccad863a..b13eaee50 100644 --- a/linphone/mediastreamer2/src/msvideo.c +++ b/linphone/mediastreamer2/src/msvideo.c @@ -63,6 +63,9 @@ int yuv_buf_init_from_mblk(YuvBuf *buf, mblk_t *m){ }else if (size==(MS_VIDEO_SIZE_1024_W*MS_VIDEO_SIZE_1024_H*3)/2){ w=MS_VIDEO_SIZE_1024_W; h=MS_VIDEO_SIZE_1024_H; + }else if (size==(MS_VIDEO_SIZE_800X600_W*MS_VIDEO_SIZE_800X600_H*3)/2){ + w=MS_VIDEO_SIZE_800X600_W; + h=MS_VIDEO_SIZE_800X600_H; }else if (size==(160*112*3)/2){/*format used by econf*/ w=160; h=112; diff --git a/linphone/mediastreamer2/src/videoenc.c b/linphone/mediastreamer2/src/videoenc.c index dddf89f2a..73835f09f 100644 --- a/linphone/mediastreamer2/src/videoenc.c +++ b/linphone/mediastreamer2/src/videoenc.c @@ -153,7 +153,7 @@ static void enc_init(MSFilter *f, enum CodecID codec) f->data=s; ms_ffmpeg_check_init(); s->profile=0;/*always default to profile 0*/ - s->comp_buf=allocb(32000,0); + s->comp_buf=NULL; s->fps=15; s->mtu=ms_get_payload_max_size()-2;/*-2 for the H263 payload header*/ s->maxbr=500000; @@ -202,7 +202,7 @@ static void prepare(EncState *s){ c->time_base.den = (int)s->fps; c->gop_size=(int)s->fps*5; /*emit I frame every 5 seconds*/ c->pix_fmt=PIX_FMT_YUV420P; - + s->comp_buf=allocb(c->bit_rate*2,0); if (s->codec==CODEC_ID_SNOW){ c->strict_std_compliance=-2; } @@ -245,7 +245,6 @@ static void prepare_mpeg4(EncState *s){ static void enc_uninit(MSFilter *f){ EncState *s=(EncState*)f->data; - if (s->comp_buf!=NULL) freemsg(s->comp_buf); ms_free(s); } #if 0 @@ -292,6 +291,10 @@ static void enc_postprocess(MSFilter *f){ avcodec_close(&s->av_context); s->av_context.codec=NULL; } + if (s->comp_buf!=NULL) { + freemsg(s->comp_buf); + s->comp_buf=NULL; + } } static void add_rfc2190_header(mblk_t **packet, AVCodecContext *context){ diff --git a/linphone/mediastreamer2/src/videoout.c b/linphone/mediastreamer2/src/videoout.c index a25a32672..f29a8237c 100644 --- a/linphone/mediastreamer2/src/videoout.c +++ b/linphone/mediastreamer2/src/videoout.c @@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "ffmpeg-priv.h" -static int video_out_handle_resize(MSFilter *f, void *arg); +static int video_out_set_vsize(MSFilter *f,void *arg); bool_t ms_display_poll_event(MSDisplay *d, MSDisplayEvent *ev){ if (d->desc->pollevent) @@ -35,7 +35,7 @@ bool_t ms_display_poll_event(MSDisplay *d, MSDisplayEvent *ev){ else return FALSE; } -#ifndef WIN32 +#ifdef HAVE_SDL #include #include @@ -78,6 +78,8 @@ static void sdl_show_window(bool_t show){ #endif +static void sdl_display_uninit(MSDisplay *obj); + static SDL_Overlay * sdl_create_window(int w, int h){ SDL_Overlay *lay; sdl_screen = SDL_SetVideoMode(w,h, 0,SDL_SWSURFACE|SDL_RESIZABLE); @@ -89,13 +91,16 @@ static SDL_Overlay * sdl_create_window(int w, int h){ if (sdl_screen->flags & SDL_HWSURFACE) ms_message("SDL surface created in hardware"); SDL_WM_SetCaption("Linphone Video", NULL); ms_message("Using yuv overlay."); - lay=SDL_CreateYUVOverlay(w,h,SDL_YV12_OVERLAY,sdl_screen); + lay=SDL_CreateYUVOverlay(w , h ,SDL_YV12_OVERLAY,sdl_screen); if (lay==NULL){ ms_warning("Couldn't create yuv overlay: %s\n", SDL_GetError()); return NULL; }else{ - if (lay->hw_overlay) ms_message("YUV overlay using hardware acceleration."); + ms_message("%i x %i YUV overlay created: hw_accel=%i, pitches=%i,%i,%i",lay->w,lay->h,lay->hw_overlay, + lay->pitches[0],lay->pitches[1],lay->pitches[2]); + ms_message("planes= %p %p %p %i %i",lay->pixels[0],lay->pixels[1],lay->pixels[2], + lay->pixels[1]-lay->pixels[0],lay->pixels[2]-lay->pixels[1]); } return lay; } @@ -113,8 +118,9 @@ static bool_t sdl_display_init(MSDisplay *obj, MSPicture *fbuf){ sdl_initialized=TRUE; ms_mutex_init(&sdl_mutex,NULL); } - if (obj->data!=NULL) + if (obj->data!=NULL){ SDL_FreeYUVOverlay((SDL_Overlay*)obj->data); + } lay=sdl_create_window(fbuf->w, fbuf->h); if (lay){ @@ -124,6 +130,8 @@ static bool_t sdl_display_init(MSDisplay *obj, MSPicture *fbuf){ fbuf->strides[0]=lay->pitches[0]; fbuf->strides[1]=lay->pitches[2]; fbuf->strides[2]=lay->pitches[1]; + fbuf->w=lay->w; + fbuf->h=lay->h; obj->data=lay; sdl_show_window(TRUE); return TRUE; @@ -158,36 +166,22 @@ static void sdl_display_update(MSDisplay *obj){ static bool_t sdl_poll_event(MSDisplay *obj, MSDisplayEvent *ev){ SDL_Event event; - static MSDisplayEvent last_ev; - static struct timeval tv; - static bool_t got_rs_ev=FALSE; - struct timeval cur; - int elapsed; bool_t ret=FALSE; + if (sdl_screen==NULL) return FALSE; ms_mutex_lock(&sdl_mutex); if (SDL_PollEvent(&event)){ ms_mutex_unlock(&sdl_mutex); switch(event.type){ case SDL_VIDEORESIZE: - last_ev.evtype=MS_DISPLAY_RESIZE_EVENT; - last_ev.w=event.resize.w; - last_ev.h=event.resize.h; - got_rs_ev=TRUE; - gettimeofday(&tv,NULL); + ev->evtype=MS_DISPLAY_RESIZE_EVENT; + ev->w=event.resize.w; + ev->h=event.resize.h; + return TRUE; break; default: break; } }else ms_mutex_unlock(&sdl_mutex); - if (got_rs_ev){ - gettimeofday(&cur,NULL); - elapsed=((cur.tv_sec-tv.tv_sec)*1000) + ((cur.tv_usec-tv.tv_usec)/1000); - if (elapsed>1000){ - got_rs_ev=FALSE; - *ev=last_ev; - ret=TRUE; - } - } return ret; } @@ -213,7 +207,7 @@ MSDisplayDesc ms_sdl_display_desc={ .pollevent=sdl_poll_event }; -#else +#elif defined(WIN32) #include @@ -386,25 +380,6 @@ static void yuv420p_to_rgb(MSPicture *src, uint8_t *rgb){ ms_error("Error in 420->rgb sws_scale()."); } sws_freeContext(sws); -#if 0 - /*revert colors*/ - { - int i,j,stride; - rgb_t pix; - stride=src->w*3; - p=rgb; - for(i=0;ih;++i){ - for(j=0;jdata; - if (wd->new_ev){ - wd->new_ev=FALSE; - *ev=wd->last_rsz; - return TRUE; - } return FALSE; } @@ -514,6 +483,24 @@ void ms_display_destroy(MSDisplay *obj){ ms_free(obj); } +#ifdef HAVE_SDL +static MSDisplayDesc *default_display_desc=&ms_sdl_display_desc; +#elif defined(WIN32) +static MSDisplayDesc *default_display_desc=&ms_win_display_desc; +#endif + +void ms_display_desc_set_default(MSDisplayDesc *desc){ + default_display_desc=desc; +} + +MSDisplayDesc * ms_display_desc_get_default(void){ + return default_display_desc; +} + +void ms_display_desc_set_default_window_id(MSDisplayDesc *desc, long id){ + desc->default_window_id=id; +} + typedef struct VideoOut { AVRational ratio; @@ -527,6 +514,7 @@ typedef struct VideoOut MSDisplay *display; bool_t own_display; bool_t ready; + bool_t autofit; } VideoOut; @@ -535,8 +523,8 @@ typedef struct VideoOut static void set_corner(VideoOut *s, int corner) { s->corner=corner; - s->local_pic.w=s->fbuf.w/SCALE_FACTOR; - s->local_pic.h=s->fbuf.h/SCALE_FACTOR; + s->local_pic.w=(s->fbuf.w/SCALE_FACTOR) & ~0x1; + s->local_pic.h=(s->fbuf.h/SCALE_FACTOR) & ~0x1; if (corner==1) { /* top left corner */ @@ -573,13 +561,10 @@ static void set_corner(VideoOut *s, int corner) } static void set_vsize(VideoOut *s, MSVideoSize *sz){ - if (s->ratio.num!=0){ - sz->width=sz->width & (~0x1); - sz->height=sz->width*s->ratio.den/s->ratio.num; - } - s->fbuf.w=sz->width; - s->fbuf.h=sz->height; - set_corner(s, s->corner); + s->fbuf.w=sz->width & ~0x1; + s->fbuf.h=sz->height & ~0x1; + set_corner(s,s->corner); + ms_message("Video size set to %ix%i",s->fbuf.w,s->fbuf.h); } static void video_out_init(MSFilter *f){ @@ -596,6 +581,7 @@ static void video_out_init(MSFilter *f){ obj->display=NULL; obj->own_display=FALSE; obj->ready=FALSE; + obj->autofit=FALSE; set_vsize(obj,&def_size); f->data=obj; } @@ -620,15 +606,10 @@ static void video_out_uninit(MSFilter *f){ ms_free(obj); } - -static void video_out_preprocess(MSFilter *f){ +static void video_out_prepare(MSFilter *f){ VideoOut *obj=(VideoOut*)f->data; if (obj->display==NULL){ -#ifndef WIN32 - obj->display=ms_display_new(&ms_sdl_display_desc); -#else - obj->display=ms_display_new(&ms_win_display_desc); -#endif + obj->display=ms_display_new(default_display_desc); obj->own_display=TRUE; } if (!ms_display_init(obj->display,&obj->fbuf)){ @@ -647,9 +628,30 @@ static void video_out_preprocess(MSFilter *f){ freemsg(obj->local_msg); obj->local_msg=NULL; } + set_corner(obj,obj->corner); obj->ready=TRUE; } +static int video_out_handle_resizing(MSFilter *f, void *data){ + VideoOut *s=(VideoOut*)f->data; + MSDisplay *disp=s->display; + if (disp!=NULL){ + MSDisplayEvent ev; + if (ms_display_poll_event(disp,&ev)){ + if (ev.evtype==MS_DISPLAY_RESIZE_EVENT){ + MSVideoSize sz; + sz.width=ev.w; + sz.height=ev.h; + ms_filter_lock(f); + set_vsize(s,&sz); + s->ready=FALSE; + ms_filter_unlock(f); + } + } + } + return 0; +} + static void video_out_postprocess(MSFilter *f){ } @@ -658,11 +660,8 @@ static void video_out_process(MSFilter *f){ VideoOut *obj=(VideoOut*)f->data; mblk_t *inm; -#ifdef WIN32 - video_out_handle_resize(f, NULL); -#endif - ms_filter_lock(f); + if (!obj->ready) video_out_prepare(f); if (obj->display==NULL){ ms_filter_unlock(f); if (f->inputs[0]!=NULL) @@ -705,6 +704,17 @@ static void video_out_process(MSFilter *f){ MSPicture src; if (yuv_buf_init_from_mblk(&src,inm)==0){ if (obj->sws1==NULL){ + MSVideoSize cur,newsize; + cur.width=obj->fbuf.w; + cur.height=obj->fbuf.h; + newsize.width=src.w; + newsize.height=src.h; + if (obj->autofit && (ms_video_size_greater_than(newsize,cur) && + !ms_video_size_equal(newsize,cur) ) ){ + set_vsize(obj,&newsize); + video_out_prepare(f); + obj->autofit=FALSE; + } obj->sws1=sws_getContext(src.w,src.h,PIX_FMT_YUV420P, obj->fbuf.w,obj->fbuf.h,PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL); @@ -734,18 +744,14 @@ static void video_out_process(MSFilter *f){ corner.planes,corner.strides,roi); ms_display_unlock(obj->display); } - ms_display_update(obj->display); ms_filter_unlock(f); } static int video_out_set_vsize(MSFilter *f,void *arg){ VideoOut *s=(VideoOut*)f->data; - bool_t reconfigure; ms_filter_lock(f); - reconfigure=s->ready; set_vsize(s,(MSVideoSize*)arg); - if (reconfigure) video_out_preprocess(f); ms_filter_unlock(f); return 0; } @@ -756,30 +762,16 @@ static int video_out_set_display(MSFilter *f,void *arg){ return 0; } -static int video_out_handle_resize(MSFilter *f, void *arg){ +static int video_out_auto_fit(MSFilter *f, void *arg){ VideoOut *s=(VideoOut*)f->data; - MSDisplay *disp=s->display; - if (disp!=NULL){ - MSDisplayEvent ev; - if (ms_display_poll_event(disp,&ev)){ - if (ev.evtype==MS_DISPLAY_RESIZE_EVENT){ - MSVideoSize sz; - sz.width=ev.w; - sz.height=ev.h; -#ifndef WIN32 - video_out_set_vsize(f,&sz); -#endif - } - } - } + s->autofit=*(int*)arg; return 0; } static int video_out_set_corner(MSFilter *f,void *arg){ VideoOut *s=(VideoOut*)f->data; - set_corner(s, *(int*)arg); -#if 1 ms_filter_lock(f); + set_corner(s, *(int*)arg); ms_display_lock(s->display); { int w=s->fbuf.w; @@ -793,15 +785,15 @@ static int video_out_set_corner(MSFilter *f,void *arg){ } ms_display_unlock(s->display); ms_filter_unlock(f); -#endif return 0; } static MSFilterMethod methods[]={ { MS_FILTER_SET_VIDEO_SIZE , video_out_set_vsize }, { MS_VIDEO_OUT_SET_DISPLAY , video_out_set_display}, - { MS_VIDEO_OUT_HANDLE_RESIZING , video_out_handle_resize}, { MS_VIDEO_OUT_SET_CORNER , video_out_set_corner}, + { MS_VIDEO_OUT_AUTO_FIT , video_out_auto_fit}, + { MS_VIDEO_OUT_HANDLE_RESIZING , video_out_handle_resizing}, { 0 ,NULL} }; @@ -816,7 +808,7 @@ MSFilterDesc ms_video_out_desc={ 2, 0, video_out_init, - video_out_preprocess, + NULL, video_out_process, video_out_postprocess, video_out_uninit, @@ -833,7 +825,7 @@ MSFilterDesc ms_video_out_desc={ .ninputs=2, .noutputs=0, .init=video_out_init, - .preprocess=video_out_preprocess, + .preprocess=NULL, .process=video_out_process, .postprocess=video_out_postprocess, .uninit=video_out_uninit, diff --git a/linphone/mediastreamer2/src/videostream.c b/linphone/mediastreamer2/src/videostream.c index fa55bffd7..0951d97f9 100644 --- a/linphone/mediastreamer2/src/videostream.c +++ b/linphone/mediastreamer2/src/videostream.c @@ -143,9 +143,11 @@ static void video_steam_process_rtcp(VideoStream *stream, mblk_t *m){ } void video_stream_iterate(VideoStream *stream){ + if (stream->output!=NULL) ms_filter_call_method_noarg(stream->output, MS_VIDEO_OUT_HANDLE_RESIZING); + if (stream->evq){ OrtpEvent *ev=ortp_ev_queue_get(stream->evq); if (ev!=NULL){ @@ -170,9 +172,15 @@ VideoStream *video_stream_new(int locport, bool_t use_ipv6){ stream->evq=ortp_ev_queue_new(); stream->rtpsend=ms_filter_new(MS_RTP_SEND_ID); rtp_session_register_event_queue(stream->session,stream->evq); + stream->sent_vsize.width=MS_VIDEO_SIZE_CIF_W; + stream->sent_vsize.height=MS_VIDEO_SIZE_CIF_H; return stream; } +void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize){ + stream->sent_vsize=vsize; +} + 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); } @@ -183,16 +191,15 @@ void video_stream_enable_adaptive_bitrate_control(VideoStream *s, bool_t yesno){ } int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *remip, int remport, - int rem_rtcp_port, int payload, int jitt_comp, MSWebCam *cam) -{ + int rem_rtcp_port, int payload, int jitt_comp, MSWebCam *cam){ PayloadType *pt; RtpSession *rtps=stream->session; MSPixFmt format; - MSVideoSize vsize; + MSVideoSize vsize,cam_vsize,disp_size; float fps=15; - - vsize.height=MS_VIDEO_SIZE_CIF_H; - vsize.width=MS_VIDEO_SIZE_CIF_W; + int tmp; + JBParameters jbp; + const int socket_buf_size=2000000; pt=rtp_profile_get_payload(profile,payload); if (pt==NULL){ @@ -217,6 +224,13 @@ int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *re rtp_session_set_recv_buf_size(stream->session,MAX_RTP_SIZE); + rtp_session_get_jitter_buffer_params(stream->session,&jbp); + jbp.max_packets=1000;//needed for high resolution video + rtp_session_set_jitter_buffer_params(stream->session,&jbp); + + rtp_session_set_rtp_socket_recv_buffer_size(stream->session,socket_buf_size); + rtp_session_set_rtp_socket_send_buffer_size(stream->session,socket_buf_size); + /* creates two rtp filters to recv send streams (remote part) */ if (remport>0) ms_filter_call_method(stream->rtpsend,MS_RTP_SEND_SET_SESSION,stream->session); @@ -239,6 +253,8 @@ int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *re ms_filter_call_method(stream->decoder,MS_FILTER_ADD_FMTP,pt->send_fmtp); } ms_filter_call_method(stream->encoder,MS_FILTER_GET_VIDEO_SIZE,&vsize); + vsize=ms_video_size_min(vsize,stream->sent_vsize); + ms_filter_call_method(stream->encoder,MS_FILTER_SET_VIDEO_SIZE,&vsize); ms_filter_call_method(stream->encoder,MS_FILTER_GET_FPS,&fps); ms_message("Setting vsize=%ix%i, fps=%f",vsize.width,vsize.height,fps); /* configure the filters */ @@ -254,24 +270,22 @@ int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *re /*set it to the pixconv */ ms_filter_call_method(stream->pixconv,MS_FILTER_SET_PIX_FMT,&format); - ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&vsize); + ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&cam_vsize); - ms_filter_call_method(stream->pixconv,MS_FILTER_SET_VIDEO_SIZE,&vsize); + ms_filter_call_method(stream->pixconv,MS_FILTER_SET_VIDEO_SIZE,&cam_vsize); } - ms_filter_call_method(stream->encoder,MS_FILTER_GET_VIDEO_SIZE,&vsize); ms_filter_call_method(stream->sizeconv,MS_FILTER_SET_VIDEO_SIZE,&vsize); /*force the decoder to output YUV420P */ format=MS_YUV420P; ms_filter_call_method(stream->decoder,MS_FILTER_SET_PIX_FMT,&format); - - /*ask the video display to always output CIF */ - vsize.height=MS_VIDEO_SIZE_CIF_H; - vsize.width=MS_VIDEO_SIZE_CIF_W; - - ms_filter_call_method(stream->output,MS_FILTER_SET_VIDEO_SIZE,&vsize); + disp_size.width=MS_VIDEO_SIZE_CIF_W; + disp_size.height=MS_VIDEO_SIZE_CIF_H; + tmp=1; + 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); if (pt->recv_fmtp!=NULL) @@ -331,12 +345,9 @@ void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const -VideoStream * video_preview_start(MSWebCam *device){ +VideoStream * video_preview_start(MSWebCam *device, MSVideoSize vsize){ VideoStream *stream = (VideoStream *)ms_new0 (VideoStream, 1); MSPixFmt format; - MSVideoSize vsize; - vsize.width=MS_VIDEO_SIZE_CIF_W; - vsize.height=MS_VIDEO_SIZE_CIF_H; /* creates the filters */ stream->source = ms_web_cam_create_reader(device); @@ -344,9 +355,9 @@ VideoStream * video_preview_start(MSWebCam *device){ /* configure the filters */ - ms_filter_call_method(stream->source,MS_FILTER_GET_PIX_FMT,&format); + ms_filter_call_method(stream->source,MS_FILTER_SET_VIDEO_SIZE,&vsize); ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&vsize); - + ms_filter_call_method(stream->source,MS_FILTER_GET_PIX_FMT,&format); if (format==MS_MJPEG){ stream->pixconv=ms_filter_new(MS_MJPEG_DEC_ID); }else{ diff --git a/linphone/mediastreamer2/tests/mediastream.c b/linphone/mediastreamer2/tests/mediastream.c index 8b1a10f0d..7210dea61 100644 --- a/linphone/mediastreamer2/tests/mediastream.c +++ b/linphone/mediastreamer2/tests/mediastream.c @@ -119,8 +119,10 @@ static void parse_events(OrtpEvQueue *q){ const char *usage="mediastream --local --remote --payload \n" "[ --fmtp ]\n" - "[ --jitter ]\n"; -static void run_media_streams(int localport, const char *remote_ip, int remoteport, int payload, const char *fmtp, int jitter, bool_t ec, int bitrate); + "[ --jitter ]\n" + "[ --width ]\n" + "[ --height ]\n"; +static void run_media_streams(int localport, const char *remote_ip, int remoteport, int payload, const char *fmtp, int jitter, bool_t ec, int bitrate, MSVideoSize vs); int main(int argc, char * argv[]) @@ -131,6 +133,7 @@ int main(int argc, char * argv[]) const char *fmtp=NULL; int jitter=50; int bitrate=0; + MSVideoSize vs; bool_t ec=FALSE; /*create the rtp session */ ortp_init(); @@ -146,6 +149,9 @@ int main(int argc, char * argv[]) rtp_profile_set_payload(&av_profile,100,&payload_type_x_snow); rtp_profile_set_payload(&av_profile,102,&payload_type_h264); #endif + + vs.width=MS_VIDEO_SIZE_CIF_W; + vs.height=MS_VIDEO_SIZE_CIF_H; if (argc<4) { printf(usage); return -1; @@ -173,17 +179,23 @@ int main(int argc, char * argv[]) }else if (strcmp(argv[i],"--bitrate")==0){ i++; bitrate=atoi(argv[i]); + }else if (strcmp(argv[i],"--width")==0){ + i++; + vs.width=atoi(argv[i]); + }else if (strcmp(argv[i],"--height")==0){ + i++; + vs.height=atoi(argv[i]); }else if (strcmp(argv[i],"--ec")==0){ ec=TRUE; } } - run_media_streams(localport,ip,remoteport,payload,fmtp,jitter,ec,bitrate); + run_media_streams(localport,ip,remoteport,payload,fmtp,jitter,ec,bitrate,vs); return 0; } -void run_media_streams(int localport, const char *remote_ip, int remoteport, int payload, const char *fmtp, int jitter, bool_t ec, int bitrate) +void run_media_streams(int localport, const char *remote_ip, int remoteport, int payload, const char *fmtp, int jitter, bool_t ec, int bitrate, MSVideoSize vs) { AudioStream *audio=NULL; #ifdef VIDEO_ENABLED @@ -212,7 +224,7 @@ void run_media_streams(int localport, const char *remote_ip, int remoteport, in #ifdef VIDEO_ENABLED printf("Starting video stream.\n"); video=video_stream_new(localport, ms_is_ipv6(remote_ip)); - + video_stream_set_sent_video_size(video,vs); video_stream_start(video,profile, remote_ip, remoteport,remoteport+1, diff --git a/linphone/mediastreamer2/tests/videodisplay.c b/linphone/mediastreamer2/tests/videodisplay.c index 9d187ac92..caff54195 100644 --- a/linphone/mediastreamer2/tests/videodisplay.c +++ b/linphone/mediastreamer2/tests/videodisplay.c @@ -24,7 +24,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. int main(int argc, char *argv[]){ VideoStream *vs; MSWebCam *cam; + MSVideoSize vsize; int i; + + vsize.width=MS_VIDEO_SIZE_CIF_W; + vsize.height=MS_VIDEO_SIZE_CIF_H; + ortp_init(); ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL); ms_init(); @@ -32,7 +37,7 @@ int main(int argc, char *argv[]){ /* this is to test the sequence start/stop */ for(i=0;i<1;++i){ int n; - vs=video_preview_start(cam); + vs=video_preview_start(cam,vsize); for(n=0;n<1000;++n){ #ifdef WIN32