[vlc-devel] commit: Fix implicit filter chain module. (Antoine Cellerier )
git version control
git at videolan.org
Mon Jun 30 21:44:28 CEST 2008
vlc | branch: master | Antoine Cellerier <dionoea at videolan.org> | Mon Jun 30 21:46:43 2008 +0200| [6ef09b541a286e0ee1e2e3a313bc22dd6f60da2f]
Fix implicit filter chain module.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6ef09b541a286e0ee1e2e3a313bc22dd6f60da2f
---
configure.ac | 2 +-
modules/video_filter/chain.c | 168 ++++++++++++++----------------------------
2 files changed, 58 insertions(+), 112 deletions(-)
diff --git a/configure.ac b/configure.ac
index 5173c81..a5dfd17 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1204,7 +1204,7 @@ if test "${SYS}" != "mingwce"; then
VLC_ADD_PLUGIN([i422_i420])
VLC_ADD_PLUGIN([yuy2_i422])
VLC_ADD_PLUGIN([yuy2_i420])
- VLC_ADD_PLUGIN([chroma_chain])
+ VLC_ADD_PLUGIN([chain])
VLC_ADD_PLUGIN([aout_file])
VLC_ADD_PLUGIN([linear_resampler])
VLC_ADD_PLUGIN([bandlimited_resampler])
diff --git a/modules/video_filter/chain.c b/modules/video_filter/chain.c
index c39fcca..359bcb3 100644
--- a/modules/video_filter/chain.c
+++ b/modules/video_filter/chain.c
@@ -32,7 +32,6 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_filter.h>
-#include <vlc_vout.h>
/*****************************************************************************
* Local and extern prototypes.
@@ -40,6 +39,7 @@
static int Activate ( vlc_object_t * );
static void Destroy ( vlc_object_t * );
static picture_t *Chain( filter_t *, picture_t * );
+static int AllocInit( filter_t *p_filter, void *p_data );
/*****************************************************************************
* Module descriptor
@@ -54,10 +54,7 @@ vlc_module_end();
struct filter_sys_t
{
- filter_t *p_filter1; /* conversion from fmt_in to fmr_mid */
- filter_t *p_filter2; /* conversion from fmt_mid to fmt_out */
- picture_t *p_tmp; /* temporary picture buffer */
- video_format_t fmt_mid;
+ filter_chain_t *p_chain;
};
static const vlc_fourcc_t pi_allowed_chromas[] = {
@@ -68,57 +65,27 @@ static const vlc_fourcc_t pi_allowed_chromas[] = {
0
};
-static picture_t *get_pic( filter_t *p_filter )
+static int CreateChain( filter_chain_t *p_chain, es_format_t *p_fmt_mid )
{
- picture_t *p_pic = (picture_t *)p_filter->p_owner;
- p_filter->p_owner = NULL;
- return p_pic;
-}
-
-/* FIXME: this is almost like DeleteFilter in src/misc/image.c */
-static void DeleteFilter( filter_t *p_filter )
-{
- vlc_object_detach( p_filter );
- if( p_filter->p_module ) module_Unneed( p_filter, p_filter->p_module );
- vlc_object_release( p_filter );
-}
-
-/* FIXME: this is almost like CreateFilter in src/misc/image.c */
-static filter_t *CreateFilter( vlc_object_t *p_this, video_format_t *fmt_in,
- video_format_t *fmt_out )
-{
- filter_t *p_filter = vlc_object_create( p_this, sizeof(filter_t) );
- vlc_object_attach( p_filter, p_this );
-
- p_filter->pf_vout_buffer_new = get_pic;
-
- p_filter->fmt_in = *fmt_in;
- p_filter->fmt_out = *fmt_out;
-
- p_filter->p_module = module_Need( p_filter, "video filter2", NULL, 0 );
-
- if( !p_filter->p_module )
+ filter_t *p_filter1;
+ if( !( p_filter1 =
+ filter_chain_AppendFilter( p_chain, NULL, NULL, NULL, p_fmt_mid )) )
+ return VLC_EGENERIC;
+ if( !filter_chain_AppendFilter( p_chain, NULL, NULL, p_fmt_mid, NULL ) )
{
- DeleteFilter( p_filter );
- return NULL;
+ filter_chain_DeleteFilter( p_chain, p_filter1 );
+ return VLC_EGENERIC;
}
-
- return p_filter;
+ return VLC_SUCCESS;
}
-static int CreateChain( vlc_object_t *p_this, filter_sys_t *p_sys )
+static int AllocInit( filter_t *p_filter, void *p_data )
{
- p_sys->p_filter1 = CreateFilter( p_this, &p_filter->fmt_in.video,
- &p_sys->fmt_mid );
- if( p_sys->p_filter1 )
- {
- p_sys->p_filter2 = CreateFilter( p_this, &p_sys->fmt_mid,
- &p_filter->fmt_out.video );
- if( p_sys->p_filter2 )
- return VLC_SUCCESS;
- DeleteFilter( p_sys->p_filter1 );
- }
- return VLC_EGENERIC;
+ /* Not sure about all of this ... it should work */
+ p_filter->pf_vout_buffer_new = ((filter_t*)p_data)->pf_vout_buffer_new;
+ p_filter->pf_vout_buffer_del = ((filter_t*)p_data)->pf_vout_buffer_del;
+ p_filter->p_owner = ((filter_t*)p_data)->p_owner;
+ return VLC_SUCCESS;
}
/*****************************************************************************
@@ -130,6 +97,7 @@ static int Activate( vlc_object_t *p_this )
{
filter_t *p_filter = (filter_t *)p_this;
static int hack = 0; /* FIXME */
+ es_format_t fmt_mid;
if( p_filter->fmt_in.video.i_chroma == p_filter->fmt_out.video.i_chroma )
return VLC_EGENERIC;
@@ -151,37 +119,60 @@ static int Activate( vlc_object_t *p_this )
memset( p_sys, 0, sizeof( filter_sys_t ) );
p_filter->p_sys = p_sys;
- if( p_filter->fmt_in.i_width != p_filter->fmt_out.i_width ||
- p_filter->fmt_in.i_height != p_filter->fmt_out.i_height ||
- p_filter->fmt_in.i_visible_width != p_filter->fmt_out.i_visible_width ||
- p_filter->fmt_in.i_visible_height != p_filter->fmt_out.i_visible_height )
+ p_sys->p_chain = filter_chain_New( p_filter, "video filter2", false, AllocInit, NULL, p_filter );
+ if( !p_sys->p_chain )
+ {
+ free( p_sys );
+ return VLC_EGENERIC;
+ }
+ filter_chain_Reset( p_sys->p_chain, &p_filter->fmt_in, &p_filter->fmt_out );
+
+ if( p_filter->fmt_in.video.i_width != p_filter->fmt_out.video.i_width ||
+ p_filter->fmt_in.video.i_height != p_filter->fmt_out.video.i_height ||
+ p_filter->fmt_in.video.i_visible_width != p_filter->fmt_out.video.i_visible_width ||
+ p_filter->fmt_in.video.i_visible_height != p_filter->fmt_out.video.i_visible_height )
{
/* Lets try resizing and then doing the chroma conversion */
- p_sys->fmt_mid = p_filter->fmt_out.video;
- p_sys->fmt_mid.i_chroma = p_filter->fmt_in.video.i_chroma;
- if( CreateChain( p_this, p_sys ) == VLC_SUCCESS )
+ es_format_Copy( &fmt_mid, &p_filter->fmt_out );
+ fmt_mid.video.i_chroma = p_filter->fmt_out.video.i_chroma;
+ if( CreateChain( p_sys->p_chain, &fmt_mid ) == VLC_SUCCESS )
+ {
+ es_format_Clean( &fmt_mid );
+ p_filter->pf_video_filter = Chain;
return VLC_SUCCESS;
+ }
/* Lets try it the other way arround (chroma and then resize) */
- p_sys->fmt_mid = p_filter->fmt_in.video;
- p_sys->fmt_mid.i_chroma = p_filter->fmt_out.video.i_chroma;
- if( CreateChain( p_this, p_sys ) == VLC_SUCCESS )
+ es_format_Clean( &fmt_mid );
+ es_format_Copy( &fmt_mid, &p_filter->fmt_in );
+ fmt_mid.video.i_chroma = p_filter->fmt_out.video.i_chroma;
+ if( CreateChain( p_sys->p_chain, &fmt_mid ) == VLC_SUCCESS )
+ {
+ es_format_Clean( &fmt_mid );
+ p_filter->pf_video_filter = Chain;
return VLC_SUCCESS;
+ }
}
else
{
/* Lets try doing a chroma chain */
int i;
- p_sys->fmt_mid = p_filter->fmt_in.video;
- for( i = 0; pi_allowed_chomas[i]; i++ )
+ es_format_Copy( &fmt_mid, &p_filter->fmt_in );
+ for( i = 0; pi_allowed_chromas[i]; i++ )
{
- p_sys->fmt_mid.i_chroma = pi_allowed_chromas[i];
- if( CreateChain( p_this, p_sys ) == VLC_SUCCESS )
+ fmt_mid.video.i_chroma = pi_allowed_chromas[i];
+ if( CreateChain( p_sys->p_chain, &fmt_mid ) == VLC_SUCCESS )
+ {
+ es_format_Clean( &fmt_mid );
+ p_filter->pf_video_filter = Chain;
return VLC_SUCCESS;
+ }
}
}
/* Hum ... looks like this really isn't going to work. Too bad. */
+ es_format_Clean( &fmt_mid );
+ filter_chain_Delete( p_sys->p_chain );
free( p_sys );
hack--;
return VLC_EGENERIC;
@@ -190,16 +181,7 @@ static int Activate( vlc_object_t *p_this )
static void Destroy( vlc_object_t *p_this )
{
filter_t *p_filter = (filter_t *)p_this;
-
- DeleteFilter( p_filter->p_sys->filter1 );
- DeleteFilter( p_filter->p_sys->filter2 );
-
- if( p_filter->p_sys->p_tmp )
- {
- free( p_filter->p_sys->p_tmp->p_data_orig );
- free( p_filter->p_sys->p_tmp );
- }
-
+ filter_chain_Delete( p_filter->p_sys->p_chain );
free( p_filter->p_sys );
}
@@ -208,41 +190,5 @@ static void Destroy( vlc_object_t *p_this )
*****************************************************************************/
static picture_t *Chain( filter_t *p_filter, picture_t *p_pic )
{
- picture_t *p_outpic = p_filter->pf_vout_buffer_new( p_filter );
- if( !p_outpic )
- {
- msg_Warn( p_filter, "can't get output picture" );
- if( p_pic->pf_release )
- p_pic->pf_release( p_pic );
- return NULL;
- }
-
-
- if( !p_sys->p_tmp )
- {
- picture_t *p_tmp = malloc( sizeof( picture_t ) );
- if( !p_tmp )
- return NULL;
- vout_AllocatePicture( VLC_OBJECT( p_vout ), p_tmp,
- p_sys->fmt_mid.i_chroma,
- p_sys->fmt_mid.i_width,
- p_sys->fmt_mid.i_height,
- p_sys->fmt_mid.i_aspect );
- p_sys->p_tmp = p_tmp;
- p_tmp->pf_release = NULL;
- p_tmp->i_status = RESERVED_PICTURE;
- p_tmp->p_sys = NULL;
- }
-
- p_sys->p_filter1->p_owner = (filter_owner_sys_t*)p_sys->p_tmp;
- if( !p_sys->p_filter1->pf_video_filter( p_sys->p_filter1, p_pic ) )
- {
- if( p_pic->pf_release )
- p_pic->pf_release( p_pic );
- return NULL;
- }
- if( p_pic->pf_release )
- p_pic->pf_release( p_pic );
- p_sys->p_filter2->p_owner = (filter_owner_sys_t*)p_outpic;
- return p_sys->p_filter2->pf_video_filter( p_sys->p_filter2, p_sys->p_tmp );
+ return filter_chain_VideoFilter( p_filter->p_sys->p_chain, p_pic );
}
More information about the vlc-devel
mailing list