From 976a25d5c9f1d3ecc622209dc9d8ed85952adc6a Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Tue, 18 Mar 2003 23:30:28 +0000 Subject: [PATCH] * modules/video_filter/clone.c: new --clone-vout-list config option, courtesy of Olivier Aubert. Allows to specify a comma separated list of vout plugins that we want to be used by the clone filter. * modules/video_filter/*: don't forget to detach the vout before destroying it. --- modules/video_filter/adjust.c | 3 +- modules/video_filter/clone.c | 105 +++++++++++++++++++++++++++--- modules/video_filter/crop.c | 3 +- modules/video_filter/distort.c | 3 +- modules/video_filter/invert.c | 3 +- modules/video_filter/motionblur.c | 3 +- modules/video_filter/transform.c | 3 +- modules/video_filter/wall.c | 4 +- 8 files changed, 112 insertions(+), 15 deletions(-) diff --git a/modules/video_filter/adjust.c b/modules/video_filter/adjust.c index c565825a15..e43aa77e11 100644 --- a/modules/video_filter/adjust.c +++ b/modules/video_filter/adjust.c @@ -2,7 +2,7 @@ * adjust.c : Contrast/Hue/Saturation/Brightness video plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: adjust.c,v 1.10 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: adjust.c,v 1.11 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Simon Latapie * @@ -184,6 +184,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/clone.c b/modules/video_filter/clone.c index 5c0b775012..c461657745 100644 --- a/modules/video_filter/clone.c +++ b/modules/video_filter/clone.c @@ -2,7 +2,7 @@ * clone.c : Clone video plugin for vlc ***************************************************************************** * Copyright (C) 2002, 2003 VideoLAN - * $Id: clone.c,v 1.7 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: clone.c,v 1.8 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -32,6 +32,8 @@ #include "filter_common.h" +#define VOUTSEPARATOR ',' + /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -54,9 +56,13 @@ static int SendEvents( vlc_object_t *, char const *, #define COUNT_LONGTEXT N_("Select the number of video windows in which to "\ "clone the video") +#define VOUTLIST_TEXT N_("list of vout modules") +#define VOUTLIST_LONGTEXT N_("Select the specific vout modules that you want to activate") + vlc_module_begin(); add_category_hint( N_("Clone"), NULL, VLC_FALSE ); add_integer( "clone-count", 2, NULL, COUNT_TEXT, COUNT_LONGTEXT, VLC_FALSE ); + add_string ( "clone-vout-list", NULL, NULL, VOUTLIST_TEXT, VOUTLIST_LONGTEXT, VLC_FALSE ); set_description( _("image clone video module") ); set_capability( "video filter", 0 ); add_shortcut( "clone" ); @@ -72,6 +78,12 @@ vlc_module_end(); struct vout_sys_t { int i_clones; + + /* list of vout modules to use. "default" will launch a default + * module. If specified, overrides the setting in i_clones (which it + * sets to the list length) */ + char **ppsz_vout_list; + vout_thread_t **pp_vout; }; @@ -83,6 +95,7 @@ struct vout_sys_t static int Create( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; + char *psz_clonelist; /* Allocate structure */ p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); @@ -98,8 +111,57 @@ static int Create( vlc_object_t *p_this ) p_vout->pf_render = Render; p_vout->pf_display = NULL; - /* Look what method was requested */ - p_vout->p_sys->i_clones = config_GetInt( p_vout, "clone-count" ); + psz_clonelist = config_GetPsz( p_vout, "clone-vout-list" ); + if( psz_clonelist ) + { + int i_dummy; + char *psz_token; + + /* Count the number of defined vout */ + p_vout->p_sys->i_clones = 1; + i_dummy = 0; + while( psz_clonelist[i_dummy] != 0 ) + { + if( psz_clonelist[i_dummy] == VOUTSEPARATOR ) + p_vout->p_sys->i_clones++; + i_dummy++; + } + + p_vout->p_sys->ppsz_vout_list = malloc( p_vout->p_sys->i_clones + * sizeof(char *) ); + if( !p_vout->p_sys->ppsz_vout_list ) + { + msg_Err( p_vout, "out of memory" ); + free( p_vout->p_sys ); + return VLC_ENOMEM; + } + + /* Tokenize the list */ + i_dummy = 0; + psz_token = psz_clonelist; + while( psz_token && *psz_token ) + { + char *psz_module; + psz_module = psz_token; + psz_token = strchr( psz_module, VOUTSEPARATOR ); + if( psz_token ) + { + *psz_token = '\0'; + psz_token++; + } + p_vout->p_sys->ppsz_vout_list[i_dummy] = strdup( psz_module ); + i_dummy++; + } + + free( psz_clonelist ); + } + else + { + /* No list was specified. We will use the default vout, and get + * the number of clones from clone-count */ + p_vout->p_sys->i_clones = config_GetInt( p_vout, "clone-count" ); + p_vout->p_sys->ppsz_vout_list = NULL; + } p_vout->p_sys->i_clones = __MAX( 1, __MIN( 99, p_vout->p_sys->i_clones ) ); @@ -124,6 +186,7 @@ static int Init( vout_thread_t *p_vout ) { int i_index, i_vout; picture_t *p_pic; + char *psz_default_vout; I_OUTPUTPICTURES = 0; @@ -136,22 +199,48 @@ static int Init( vout_thread_t *p_vout ) /* Try to open the real video output */ msg_Dbg( p_vout, "spawning the real video outputs" ); + /* Save the default vout */ + psz_default_vout = config_GetPsz( p_vout, "vout" ); + for( i_vout = 0; i_vout < p_vout->p_sys->i_clones; i_vout++ ) { - p_vout->p_sys->pp_vout[ i_vout ] = vout_Create( p_vout, - p_vout->render.i_width, p_vout->render.i_height, - p_vout->render.i_chroma, p_vout->render.i_aspect ); + if( p_vout->p_sys->ppsz_vout_list == NULL + || ( !strncmp( p_vout->p_sys->ppsz_vout_list[i_vout], + "default", 8 ) ) ) + { + p_vout->p_sys->pp_vout[i_vout] = + vout_Create( p_vout, p_vout->render.i_width, + p_vout->render.i_height, p_vout->render.i_chroma, + p_vout->render.i_aspect ); + } + else + { + /* create the appropriate vout instead of the default one */ + config_PutPsz( p_vout, "vout", + p_vout->p_sys->ppsz_vout_list[i_vout] ); + p_vout->p_sys->pp_vout[i_vout] = + vout_Create( p_vout, p_vout->render.i_width, + p_vout->render.i_height, p_vout->render.i_chroma, + p_vout->render.i_aspect ); + + /* Reset the default value */ + config_PutPsz( p_vout, "vout", psz_default_vout ); + } + if( p_vout->p_sys->pp_vout[ i_vout ] == NULL ) { msg_Err( p_vout, "failed to clone %i vout threads", - p_vout->p_sys->i_clones ); + p_vout->p_sys->i_clones ); p_vout->p_sys->i_clones = i_vout; + if( psz_default_vout ) free( psz_default_vout ); RemoveAllVout( p_vout ); return VLC_EGENERIC; } + ADD_CALLBACKS( p_vout->p_sys->pp_vout[ i_vout ], SendEvents ); } + if( psz_default_vout ) free( psz_default_vout ); ALLOCATE_DIRECTBUFFERS( VOUT_MAX_PICTURES ); return VLC_SUCCESS; @@ -263,6 +352,7 @@ static void RemoveAllVout( vout_thread_t *p_vout ) --p_vout->p_sys->i_clones; DEL_CALLBACKS( p_vout->p_sys->pp_vout[p_vout->p_sys->i_clones], SendEvents ); + vlc_object_detach( p_vout->p_sys->pp_vout[p_vout->p_sys->i_clones] ); vout_Destroy( p_vout->p_sys->pp_vout[p_vout->p_sys->i_clones] ); } } @@ -277,4 +367,3 @@ static int SendEvents( vlc_object_t *p_this, char const *psz_var, return VLC_SUCCESS; } - diff --git a/modules/video_filter/crop.c b/modules/video_filter/crop.c index 90ebb9fbba..25818a8692 100644 --- a/modules/video_filter/crop.c +++ b/modules/video_filter/crop.c @@ -2,7 +2,7 @@ * crop.c : Crop video plugin for vlc ***************************************************************************** * Copyright (C) 2002, 2003 VideoLAN - * $Id: crop.c,v 1.8 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: crop.c,v 1.9 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -276,6 +276,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/distort.c b/modules/video_filter/distort.c index b12371b985..02c9fdd76e 100644 --- a/modules/video_filter/distort.c +++ b/modules/video_filter/distort.c @@ -2,7 +2,7 @@ * distort.c : Misc video effects plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: distort.c,v 1.7 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: distort.c,v 1.8 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -232,6 +232,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/invert.c b/modules/video_filter/invert.c index 99c5f34012..67d3a390bf 100644 --- a/modules/video_filter/invert.c +++ b/modules/video_filter/invert.c @@ -2,7 +2,7 @@ * invert.c : Invert video plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: invert.c,v 1.5 2003/01/17 16:18:03 sam Exp $ + * $Id: invert.c,v 1.6 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -155,6 +155,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/motionblur.c b/modules/video_filter/motionblur.c index a6503b5e79..efb0e0fde2 100644 --- a/modules/video_filter/motionblur.c +++ b/modules/video_filter/motionblur.c @@ -2,7 +2,7 @@ * motion_blur.c : motion blur filter for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: motionblur.c,v 1.8 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: motionblur.c,v 1.9 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Sigmund Augdal * @@ -195,6 +195,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/transform.c b/modules/video_filter/transform.c index a5b9384780..c03dcd95ae 100644 --- a/modules/video_filter/transform.c +++ b/modules/video_filter/transform.c @@ -2,7 +2,7 @@ * transform.c : transform image plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: transform.c,v 1.9 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: transform.c,v 1.10 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -230,6 +230,7 @@ static void Destroy( vlc_object_t *p_this ) vout_thread_t *p_vout = (vout_thread_t *)p_this; DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); + vlc_object_detach( p_vout->p_sys->p_vout ); vout_Destroy( p_vout->p_sys->p_vout ); free( p_vout->p_sys ); diff --git a/modules/video_filter/wall.c b/modules/video_filter/wall.c index 80b5568388..32b8a47a30 100644 --- a/modules/video_filter/wall.c +++ b/modules/video_filter/wall.c @@ -2,7 +2,7 @@ * wall.c : Wall video plugin for vlc ***************************************************************************** * Copyright (C) 2000, 2001, 2002, 2003 VideoLAN - * $Id: wall.c,v 1.7 2003/02/20 01:52:46 sigmunau Exp $ + * $Id: wall.c,v 1.8 2003/03/18 23:30:28 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -423,6 +423,8 @@ static void RemoveAllVout( vout_thread_t *p_vout ) DEL_CALLBACKS( p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout, SendEvents ); + vlc_object_detach( + p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout ); vout_Destroy( p_vout->p_sys->pp_vout[ p_vout->p_sys->i_vout ].p_vout ); } -- 2.39.2