diff options
49 files changed, 702 insertions, 89 deletions
diff --git a/cfg-common.h b/cfg-common.h index 4a8876eea3..ac222efd6f 100644 --- a/cfg-common.h +++ b/cfg-common.h @@ -150,7 +150,8 @@ {"pphelp", &pp_help, CONF_TYPE_PRINT_INDIRECT, CONF_NOCFG, 0, 0, NULL}, #endif - {"vop", &vo_plugin_args, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, + {"vop", &vo_plugin_args, CONF_TYPE_OBJ_SETTINGS_LIST, 0, 0, 0,&vf_obj_list }, + {"vf", &vf_settings, CONF_TYPE_OBJ_SETTINGS_LIST, 0, 0, 0, &vf_obj_list}, // scaling: {"sws", &sws_flags, CONF_TYPE_INT, 0, 0, 2, NULL}, @@ -336,6 +337,8 @@ extern int mf_w; extern int mf_h; extern float mf_fps; extern char * mf_type; +extern m_obj_settings_t* vf_settings; +extern m_obj_list_t vf_obj_list; struct config mfopts_conf[]={ {"on", &mf_support, CONF_TYPE_FLAG, 0, 0, 1, NULL}, @@ -346,7 +349,7 @@ struct config mfopts_conf[]={ {NULL, NULL, 0, 0, 0, 0, NULL} }; -extern char** vo_plugin_args; +extern m_obj_settings_t* vo_plugin_args; #include "libaf/af.h" extern af_cfg_t af_cfg; // Audio filter configuration, defined in libmpcodecs/dec_audio.c diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index d4629d7e12..e833065ad3 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -9,6 +9,8 @@ #include "../mp_msg.h" #include "../help_mp.h" +#include "../m_option.h" +#include "../m_struct.h" #include "img_format.h" @@ -60,8 +62,6 @@ extern vf_info_t vf_info_detc; extern vf_info_t vf_info_telecine; extern vf_info_t vf_info_tfields; -char** vo_plugin_args=(char**) NULL; - // list of available filters: static vf_info_t* filter_list[]={ &vf_info_rectangle, @@ -116,6 +116,17 @@ static vf_info_t* filter_list[]={ NULL }; +// For the vf option +m_obj_settings_t* vf_settings = NULL; +// For the vop option +m_obj_settings_t* vo_plugin_args = NULL; +m_obj_list_t vf_obj_list = { + (void**)filter_list, + M_ST_OFF(vf_info_t,name), + M_ST_OFF(vf_info_t,info), + M_ST_OFF(vf_info_t,opts) +}; + //============================================================================ // mpi stuff: @@ -306,7 +317,7 @@ static int vf_default_query_format(struct vf_instance_s* vf, unsigned int fmt){ return vf_next_query_format(vf,fmt); } -vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char *args){ +vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char **args){ vf_instance_t* vf; int i; for(i=0;;i++){ @@ -326,18 +337,48 @@ vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char vf->put_image=vf_next_put_image; vf->default_caps=VFCAP_ACCEPT_STRIDE; vf->default_reqs=0; - if(vf->info->open(vf,args)>0) return vf; // Success! + if(vf->info->opts) { // vf_vo get some special argument + m_struct_t* st = vf->info->opts; + void* vf_priv = m_struct_alloc(st); + int n; + for(n = 0 ; args && args[2*n] ; n++) + m_struct_set(st,vf_priv,args[2*n],args[2*n+1]); + vf->priv = vf_priv; + args = NULL; + } else // Otherwise we should have the '_oldargs_' + if(args && !strcmp(args[0],"_oldargs_")) + args = (char**)args[1]; + else + args = NULL; + if(vf->info->open(vf,(char*)args)>0) return vf; // Success! free(vf); mp_msg(MSGT_VFILTER,MSGL_ERR,MSGTR_CouldNotOpenVideoFilter,name); return NULL; } -vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char *args){ - if(strcmp(name,"vo")) - mp_msg(MSGT_VFILTER,MSGL_INFO, - args ? MSGTR_OpeningVideoFilter "[%s=%s]\n" - : MSGTR_OpeningVideoFilter "[%s]\n",name,args); - return vf_open_plugin(filter_list,next,name,args); +vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char **args){ + if(args && strcmp(args[0],"_oldargs_")) { + int i,l = 0; + for(i = 0 ; args && args[2*i] ; i++) + l += 1 + strlen(args[2*i]) + 1 + strlen(args[2*i+1]); + l += strlen(name); + { + char str[l+1]; + char* p = str; + p += sprintf(str,"%s",name); + for(i = 0 ; args && args[2*i] ; i++) + p += sprintf(p," %s=%s",args[2*i],args[2*i+1]); + mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter "[%s]\n",str); + } + } else if(strcmp(name,"vo")) { + if(args && strcmp(args[0],"_oldargs_") == 0) + mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter + "[%s=%s]\n", name,args[1]); + else + mp_msg(MSGT_VFILTER,MSGL_INFO,MSGTR_OpeningVideoFilter + "[%s]\n", name); + } + return vf_open_plugin(filter_list,next,name,args); } //============================================================================ @@ -425,19 +466,27 @@ void vf_next_draw_slice(struct vf_instance_s* vf,unsigned char** src, int * stri //============================================================================ vf_instance_t* append_filters(vf_instance_t* last){ - vf_instance_t* vf; - char** plugin_args = vo_plugin_args; - if(!vo_plugin_args) return last; - while(*plugin_args){ - char* name=strdup(*plugin_args); - char* args=strchr(name,'='); - if(args){args[0]=0;++args;} - vf=vf_open_filter(last,name,args); - if(vf) last=vf; - free(name); - ++plugin_args; + vf_instance_t* vf; + int i; + + // -vf take precedence over -vop + if(vf_settings) { + // We want to add them in the 'right order' + for(i = 0 ; vf_settings[i].name ; i++) + /* NOP */; + for(i-- ; i >= 0 ; i--) { + //printf("Open filter %s\n",vf_settings[i].name); + vf = vf_open_filter(last,vf_settings[i].name,vf_settings[i].attribs); + if(vf) last=vf; } - return last; + } else if(vo_plugin_args) { + for(i = 0 ; vo_plugin_args[i].name ; i++) { + vf = vf_open_filter(last,vo_plugin_args[i].name, + vo_plugin_args[i].attribs); + if(vf) last=vf; + } + } + return last; } //============================================================================ diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h index ffe8ef934a..1f21500ac7 100644 --- a/libmpcodecs/vf.h +++ b/libmpcodecs/vf.h @@ -8,6 +8,8 @@ typedef struct vf_info_s { const char *author; const char *comment; int (*open)(struct vf_instance_s* vf,char* args); + // Ptr to a struct dscribing the options + void* opts; } vf_info_t; typedef struct vf_image_context_s { @@ -67,8 +69,8 @@ typedef struct vf_seteq_s void vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h); mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h); -vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char *args); -vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char *args); +vf_instance_t* vf_open_plugin(vf_info_t** filter_list, vf_instance_t* next, char *name, char **args); +vf_instance_t* vf_open_filter(vf_instance_t* next, char *name, char **args); vf_instance_t* vf_open_encoder(vf_instance_t* next, char *name, char *args); unsigned int vf_match_csp(vf_instance_t** vfp,unsigned int* list,unsigned int preferred); diff --git a/libmpcodecs/vf_1bpp.c b/libmpcodecs/vf_1bpp.c index 2d6a959dc9..f1c9e5920d 100644 --- a/libmpcodecs/vf_1bpp.c +++ b/libmpcodecs/vf_1bpp.c @@ -178,7 +178,8 @@ vf_info_t vf_info_1bpp = { "1bpp", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_2xsai.c b/libmpcodecs/vf_2xsai.c index 20db798722..21a8f48ab9 100644 --- a/libmpcodecs/vf_2xsai.c +++ b/libmpcodecs/vf_2xsai.c @@ -357,7 +357,8 @@ vf_info_t vf_info_2xsai = { "2xsai", "A'rpi", "http://elektron.its.tudelft.nl/~dalikifa/", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_bmovl.c b/libmpcodecs/vf_bmovl.c index 5cba56d6f0..8f5bad8f53 100644 --- a/libmpcodecs/vf_bmovl.c +++ b/libmpcodecs/vf_bmovl.c @@ -452,5 +452,6 @@ vf_info_t vf_info_bmovl = { "bmovl", "Per Wigren", "", - vf_open + vf_open, + NULL }; diff --git a/libmpcodecs/vf_boxblur.c b/libmpcodecs/vf_boxblur.c index a5e7f9767a..729c174d72 100644 --- a/libmpcodecs/vf_boxblur.c +++ b/libmpcodecs/vf_boxblur.c @@ -212,7 +212,8 @@ vf_info_t vf_info_boxblur = { "boxblur", "Michael Niedermayer", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_crop.c b/libmpcodecs/vf_crop.c index f00cccadad..110bac5176 100644 --- a/libmpcodecs/vf_crop.c +++ b/libmpcodecs/vf_crop.c @@ -115,7 +115,8 @@ vf_info_t vf_info_crop = { "crop", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_cropdetect.c b/libmpcodecs/vf_cropdetect.c index c8d4aae560..e8bdf83e88 100644 --- a/libmpcodecs/vf_cropdetect.c +++ b/libmpcodecs/vf_cropdetect.c @@ -133,7 +133,8 @@ vf_info_t vf_info_cropdetect = { "cropdetect", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_denoise3d.c b/libmpcodecs/vf_denoise3d.c index 03b4569991..ea9e5f27a0 100644 --- a/libmpcodecs/vf_denoise3d.c +++ b/libmpcodecs/vf_denoise3d.c @@ -265,7 +265,8 @@ vf_info_t vf_info_denoise3d = { "denoise3d", "Daniel Moreno", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_detc.c b/libmpcodecs/vf_detc.c index bccd3c6c9e..bf311d7938 100644 --- a/libmpcodecs/vf_detc.c +++ b/libmpcodecs/vf_detc.c @@ -457,7 +457,8 @@ vf_info_t vf_info_detc = { "detc", "Rich Felker", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_dint.c b/libmpcodecs/vf_dint.c index 679a306ae6..80f95b1263 100644 --- a/libmpcodecs/vf_dint.c +++ b/libmpcodecs/vf_dint.c @@ -191,5 +191,6 @@ vf_info_t vf_info_dint = { "dint", "A.G.", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_down3dright.c b/libmpcodecs/vf_down3dright.c index c142c05675..6a9f979420 100644 --- a/libmpcodecs/vf_down3dright.c +++ b/libmpcodecs/vf_down3dright.c @@ -139,6 +139,7 @@ vf_info_t vf_info_down3dright = { "down3dright", "Zdenek Kabelac", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_dvbscale.c b/libmpcodecs/vf_dvbscale.c index 987482e12b..3dcdb1b3fa 100644 --- a/libmpcodecs/vf_dvbscale.c +++ b/libmpcodecs/vf_dvbscale.c @@ -42,7 +42,8 @@ vf_info_t vf_info_dvbscale = { "dvbscale", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_eq.c b/libmpcodecs/vf_eq.c index 8ee2f6bf30..a5c27b7fd1 100644 --- a/libmpcodecs/vf_eq.c +++ b/libmpcodecs/vf_eq.c @@ -219,6 +219,7 @@ vf_info_t vf_info_eq = { "eq", "Richard Felker", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_eq2.c b/libmpcodecs/vf_eq2.c index 919b2ad8c9..ae7ce9beda 100644 --- a/libmpcodecs/vf_eq2.c +++ b/libmpcodecs/vf_eq2.c @@ -463,5 +463,6 @@ vf_info_t vf_info_eq2 = { "eq2", "Hampa Hug, Daniel Moreno, Richard Felker", "", - &open + &open, + NULL }; diff --git a/libmpcodecs/vf_expand.c b/libmpcodecs/vf_expand.c index 550fdb20b6..e3681d9d84 100644 --- a/libmpcodecs/vf_expand.c +++ b/libmpcodecs/vf_expand.c @@ -356,7 +356,8 @@ vf_info_t vf_info_expand = { "expand", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_fame.c b/libmpcodecs/vf_fame.c index a996019aa8..820865e0a5 100644 --- a/libmpcodecs/vf_fame.c +++ b/libmpcodecs/vf_fame.c @@ -145,7 +145,8 @@ vf_info_t vf_info_fame = { "fame", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_field.c b/libmpcodecs/vf_field.c index 0e2a5c9585..21efc7b59e 100644 --- a/libmpcodecs/vf_field.c +++ b/libmpcodecs/vf_field.c @@ -72,7 +72,8 @@ vf_info_t vf_info_field = { "field", "Rich Felker", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_flip.c b/libmpcodecs/vf_flip.c index 78706aff2f..7977dd9229 100644 --- a/libmpcodecs/vf_flip.c +++ b/libmpcodecs/vf_flip.c @@ -90,7 +90,8 @@ vf_info_t vf_info_flip = { "flip", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_format.c b/libmpcodecs/vf_format.c index 5e351f0d2d..772a575478 100644 --- a/libmpcodecs/vf_format.c +++ b/libmpcodecs/vf_format.c @@ -66,7 +66,8 @@ vf_info_t vf_info_format = { "format", "A'rpi", "FIXME! get_image()/put_image()", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_halfpack.c b/libmpcodecs/vf_halfpack.c index dac3c61630..b4fc0e648f 100644 --- a/libmpcodecs/vf_halfpack.c +++ b/libmpcodecs/vf_halfpack.c @@ -216,6 +216,7 @@ vf_info_t vf_info_halfpack = { "halfpack", "Richard Felker", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_hqdn3d.c b/libmpcodecs/vf_hqdn3d.c index 341c282288..ce59d0f66e 100644 --- a/libmpcodecs/vf_hqdn3d.c +++ b/libmpcodecs/vf_hqdn3d.c @@ -290,7 +290,8 @@ vf_info_t vf_info_hqdn3d = { "hqdn3d", "Daniel Moreno & A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_il.c b/libmpcodecs/vf_il.c index d4e9a840db..1cbf1135ec 100644 --- a/libmpcodecs/vf_il.c +++ b/libmpcodecs/vf_il.c @@ -145,7 +145,8 @@ vf_info_t vf_info_il = { "il", "Michael Niedermayer", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_lavc.c b/libmpcodecs/vf_lavc.c index 5c84665368..57378e9b05 100644 --- a/libmpcodecs/vf_lavc.c +++ b/libmpcodecs/vf_lavc.c @@ -200,7 +200,8 @@ vf_info_t vf_info_lavc = { "lavc", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_lavcdeint.c b/libmpcodecs/vf_lavcdeint.c index eee128768c..7b4188eefe 100644 --- a/libmpcodecs/vf_lavcdeint.c +++ b/libmpcodecs/vf_lavcdeint.c @@ -183,7 +183,8 @@ vf_info_t vf_info_lavcdeint = { "Joe Rabinoff", "libavcodec's internal deinterlacer, in case you don't like " "the builtin ones (invoked with -pp or -npp)", - open + open, + NULL }; diff --git a/libmpcodecs/vf_mirror.c b/libmpcodecs/vf_mirror.c index a16a062ab4..3d77730e12 100644 --- a/libmpcodecs/vf_mirror.c +++ b/libmpcodecs/vf_mirror.c @@ -109,7 +109,8 @@ vf_info_t vf_info_mirror = { "mirror", "Eyck", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_noise.c b/libmpcodecs/vf_noise.c index 7a1ce5b739..d11178a100 100644 --- a/libmpcodecs/vf_noise.c +++ b/libmpcodecs/vf_noise.c @@ -464,7 +464,8 @@ vf_info_t vf_info_noise = { "noise", "Michael Niedermayer", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_palette.c b/libmpcodecs/vf_palette.c index b7f2cd7d2d..51d69405dc 100644 --- a/libmpcodecs/vf_palette.c +++ b/libmpcodecs/vf_palette.c @@ -190,7 +190,8 @@ vf_info_t vf_info_palette = { "palette", "A'rpi & Alex", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_perspective.c b/libmpcodecs/vf_perspective.c index 30ee17fcd3..59e2f3f467 100644 --- a/libmpcodecs/vf_perspective.c +++ b/libmpcodecs/vf_perspective.c @@ -335,7 +335,8 @@ vf_info_t vf_info_perspective = { "perspective", "Michael Niedermayer", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_pp.c b/libmpcodecs/vf_pp.c index 58b996bc72..f9b79039ea 100644 --- a/libmpcodecs/vf_pp.c +++ b/libmpcodecs/vf_pp.c @@ -239,7 +239,8 @@ vf_info_t vf_info_pp = { "pp", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_rectangle.c b/libmpcodecs/vf_rectangle.c index a27c3f8bff..2325c08410 100644 --- a/libmpcodecs/vf_rectangle.c +++ b/libmpcodecs/vf_rectangle.c @@ -168,5 +168,6 @@ vf_info_t vf_info_rectangle = { "rectangle", "Kim Minh Kaplan", "", - open + open, + NULL }; diff --git a/libmpcodecs/vf_rgb2bgr.c b/libmpcodecs/vf_rgb2bgr.c index 99574b17db..0db4b2c4d2 100644 --- a/libmpcodecs/vf_rgb2bgr.c +++ b/libmpcodecs/vf_rgb2bgr.c @@ -97,7 +97,8 @@ vf_info_t vf_info_rgb2bgr = { "rgb2bgr", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_rotate.c b/libmpcodecs/vf_rotate.c index fb5e7e96e8..5cb42a86ae 100644 --- a/libmpcodecs/vf_rotate.c +++ b/libmpcodecs/vf_rotate.c @@ -130,7 +130,8 @@ vf_info_t vf_info_rotate = { "rotate", "A'rpi", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_sab.c b/libmpcodecs/vf_sab.c index d4b6d5b419..3c6e686ac9 100644 --- a/libmpcodecs/vf_sab.c +++ b/libmpcodecs/vf_sab.c @@ -311,7 +311,8 @@ vf_info_t vf_info_sab = { "sab", "Michael Niedermayer", "", - open + open, + NULL }; //===========================================================================// diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c index fd8a1f061b..9637804dd7 100644 --- a/libmpcodecs/vf_scale.c +++ b/libmpcodecs/vf_scale.c @@ -13,7 +13,10 @@ #include "../libvo/fastmemcpy.h" #include "../postproc/swscale.h" -struct vf_priv_s { +#include "m_option.h" +#include "m_struct.h" + +static struct vf_priv_s { int w,h; int v_chr_drop; int param; @@ -21,6 +24,14 @@ struct vf_priv_s { struct SwsContext *ctx; unsigned char* palette; mp_image_t *dmpi; +} vf_priv_dflt = { + -1,-1, + 0, + 0, + 0, + NULL, + NULL, + NULL }; |