X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fchain.c;h=6642dd0539ca21dbe41d6218853380328f34d0ce;hb=e875fef573cb51a0e453b715f19efe21867da3be;hp=7ea91eb3dd4a3a52b92db5cf0faa8fc99d7313ec;hpb=c5c06b64c806052086e5772d64e540a8db7e4a9b;p=vlc diff --git a/modules/video_filter/chain.c b/modules/video_filter/chain.c index 7ea91eb3dd..6642dd0539 100644 --- a/modules/video_filter/chain.c +++ b/modules/video_filter/chain.c @@ -54,7 +54,7 @@ static int BufferAllocationInit ( filter_t *, void * ); static int BuildChromaResize( filter_t * ); static int BuildChromaChain( filter_t *p_filter ); -static int CreateChain( filter_chain_t *p_chain, es_format_t *p_fmt_mid ); +static int CreateChain( filter_chain_t *p_chain, es_format_t *p_fmt_mid, config_chain_t * ); static void EsFormatMergeSize( es_format_t *p_dst, const es_format_t *p_base, const es_format_t *p_size ); @@ -72,7 +72,7 @@ struct filter_sys_t filter_chain_t *p_chain; }; -#define CHAIN_LEVEL_MAX 4 +#define CHAIN_LEVEL_MAX 1 /***************************************************************************** * Activate: allocate a chroma function @@ -88,24 +88,19 @@ static int Activate( vlc_object_t *p_this ) const bool b_chroma = p_filter->fmt_in.video.i_chroma != p_filter->fmt_out.video.i_chroma; const bool b_resize = 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; - - /* XXX Remove check on b_resize to build chroma chain (untested) */ - if( !b_chroma || !b_resize ) + if( !b_chroma && !b_resize ) return VLC_EGENERIC; - p_sys = p_filter->p_sys = malloc( sizeof( *p_sys ) ); + p_sys = p_filter->p_sys = calloc( 1, sizeof( *p_sys ) ); if( !p_sys ) return VLC_ENOMEM; - memset( p_sys, 0, sizeof( *p_sys ) ); - p_sys->p_chain = filter_chain_New( p_filter, "video filter2", false, BufferAllocationInit, 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( b_chroma && b_resize ) i_ret = BuildChromaResize( p_filter ); @@ -151,17 +146,21 @@ static int BuildChromaResize( filter_t *p_filter ) int i_ret; /* Lets try resizing and then doing the chroma conversion */ + filter_chain_Reset( p_sys->p_chain, &p_filter->fmt_in, &p_filter->fmt_out ); + msg_Dbg( p_filter, "Trying to build resize+chroma" ); EsFormatMergeSize( &fmt_mid, &p_filter->fmt_in, &p_filter->fmt_out ); - i_ret = CreateChain( p_sys->p_chain, &fmt_mid ); + i_ret = CreateChain( p_sys->p_chain, &fmt_mid, NULL ); es_format_Clean( &fmt_mid ); if( i_ret == VLC_SUCCESS ) return VLC_SUCCESS; /* Lets try it the other way arround (chroma and then resize) */ + filter_chain_Reset( p_sys->p_chain, &p_filter->fmt_in, &p_filter->fmt_out ); + msg_Dbg( p_filter, "Trying to build chroma+resize" ); EsFormatMergeSize( &fmt_mid, &p_filter->fmt_out, &p_filter->fmt_in ); - i_ret = CreateChain( p_sys->p_chain, &fmt_mid ); + i_ret = CreateChain( p_sys->p_chain, &fmt_mid, NULL ); es_format_Clean( &fmt_mid ); if( i_ret == VLC_SUCCESS ) return VLC_SUCCESS; @@ -173,44 +172,68 @@ static int BuildChromaChain( filter_t *p_filter ) { filter_sys_t *p_sys = p_filter->p_sys; es_format_t fmt_mid; - int i_ret; - int i; /* We have to protect ourself against a too high recursion */ const char *psz_option = MODULE_STRING"-level"; - bool b_first = !var_Type( p_filter, psz_option ); - - if( var_Create( p_filter, MODULE_STRING"-level", VLC_VAR_INTEGER | (b_first ? VLC_VAR_DOINHERIT : 0 ) ) ) - { - msg_Err( p_filter, "Failed to create %s variable", psz_option ); - return VLC_EGENERIC; - } - int i_level = var_GetInteger( p_filter, psz_option ); - if( i_level >= CHAIN_LEVEL_MAX ) + int i_level = 0; + for( const config_chain_t *c = p_filter->p_cfg; c != NULL; c = c->p_next) { - msg_Err( p_filter, "Too high level of recursion (%d)", i_level ); - return VLC_EGENERIC; + if( c->psz_name && c->psz_value && !strcmp(c->psz_name, psz_option) ) + { + i_level = atoi(c->psz_value); + if( i_level < 0 || i_level > CHAIN_LEVEL_MAX ) + { + msg_Err( p_filter, "Too high level of recursion (%d)", i_level ); + return VLC_EGENERIC; + } + break; + } } - var_SetInteger( p_filter, psz_option, i_level + 1 ); + + /* */ + int i_ret = VLC_EGENERIC; + + /* */ + config_chain_t cfg_level; + memset(&cfg_level, 0, sizeof(cfg_level)); + cfg_level.psz_name = strdup(psz_option); + if( asprintf( &cfg_level.psz_value, "%d", i_level + 1) < 0 ) + cfg_level.psz_value = NULL; + if( !cfg_level.psz_name || !cfg_level.psz_value ) + goto exit; /* Now try chroma format list */ - for( i = 0; pi_allowed_chromas[i]; i++ ) + for( int i = 0; pi_allowed_chromas[i]; i++ ) { const vlc_fourcc_t i_chroma = pi_allowed_chromas[i]; + if( i_chroma == p_filter->fmt_in.i_codec || + i_chroma == p_filter->fmt_out.i_codec ) + continue; msg_Dbg( p_filter, "Trying to use chroma %4.4s as middle man", (char*)&i_chroma ); es_format_Copy( &fmt_mid, &p_filter->fmt_in ); + fmt_mid.i_codec = fmt_mid.video.i_chroma = i_chroma; + fmt_mid.video.i_rmask = 0; + fmt_mid.video.i_gmask = 0; + fmt_mid.video.i_bmask = 0; + video_format_FixRgb(&fmt_mid.video); + + filter_chain_Reset( p_sys->p_chain, &p_filter->fmt_in, &p_filter->fmt_out ); - i_ret = CreateChain( p_sys->p_chain, &fmt_mid ); + i_ret = CreateChain( p_sys->p_chain, &fmt_mid, &cfg_level ); es_format_Clean( &fmt_mid ); if( i_ret == VLC_SUCCESS ) - return VLC_SUCCESS; + break; } - return VLC_EGENERIC; + +exit: + free( cfg_level.psz_name ); + free( cfg_level.psz_value ); + return i_ret; } /***************************************************************************** @@ -230,8 +253,8 @@ static void BufferDel( filter_t *p_filter, picture_t *p_pic ) } static int BufferAllocationInit ( filter_t *p_filter, void *p_data ) { - p_filter->pf_vout_buffer_new = BufferNew; - p_filter->pf_vout_buffer_del = BufferDel; + p_filter->pf_video_buffer_new = BufferNew; + p_filter->pf_video_buffer_del = BufferDel; p_filter->p_owner = p_data; return VLC_SUCCESS; } @@ -239,13 +262,13 @@ static int BufferAllocationInit ( filter_t *p_filter, void *p_data ) /***************************************************************************** * *****************************************************************************/ -static int CreateChain( filter_chain_t *p_chain, es_format_t *p_fmt_mid ) +static int CreateChain( filter_chain_t *p_chain, es_format_t *p_fmt_mid, config_chain_t *p_cfg ) { filter_t *p_filter1; if( !( p_filter1 = - filter_chain_AppendFilter( p_chain, NULL, NULL, NULL, p_fmt_mid )) ) + filter_chain_AppendFilter( p_chain, NULL, p_cfg, NULL, p_fmt_mid )) ) return VLC_EGENERIC; - if( !filter_chain_AppendFilter( p_chain, NULL, NULL, p_fmt_mid, NULL ) ) + if( !filter_chain_AppendFilter( p_chain, NULL, p_cfg, p_fmt_mid, NULL ) ) { filter_chain_DeleteFilter( p_chain, p_filter1 ); return VLC_EGENERIC;