Mercurial > mplayer.hg
changeset 17471:63909962d3fc
Profiles support.
author | albeu |
---|---|
date | Tue, 24 Jan 2006 11:16:13 +0000 |
parents | 21123e349463 |
children | 526abfe30498 |
files | DOCS/man/en/mplayer.1 m_config.c m_config.h parser-cfg.c |
diffstat | 4 files changed, 275 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1 Tue Jan 24 11:14:13 2006 +0000 +++ b/DOCS/man/en/mplayer.1 Tue Jan 24 11:16:13 2006 +0000 @@ -530,6 +530,34 @@ ~/.mplayer/ or in the same directory as the file. . .\" -------------------------------------------------------------------------- +.\" Profiles +.\" -------------------------------------------------------------------------- +. +.SH "PROFILES" +To ease working with different configurations profiles can be defined in the +configuration files. A profile start with its name between square brackets, +eg. '[my-profile]'. All following options will be part of the profile. +A description (shown by \-profile help) can be defined with the profile-desc +option. To end the profile start another one or use the profile name 'default' +to continue with normal options. +.fi +.PP +.I "EXAMPLE MENCODER PROFILE:" +.sp 1 +.nf + +[mpeg4] +profile-desc="MPEG4 encoding" +ovc=lacv=yes +lavcopts=vcodec=mpeg4:vbitrate=1200 + +[mpeg4-hq] +profile-desc="HQ MPEG4 encoding" +profile=mpeg4 +lavcopts=mbd=2:trell=yes:v4mv=yes +.fi +. +.\" -------------------------------------------------------------------------- .\" Options .\" -------------------------------------------------------------------------- . @@ -605,10 +633,18 @@ .RE . .TP +.B \-profile <profile1,profile2,...> +Use the given profile(s), \-profile help display a list of the defined profiles. +. +.TP .B \-really-quiet (also see \-quiet) Display even less output and status messages than with \-quiet. . .TP +.B \-show-profile <profile> +Show the description and content of a profile. +. +.TP .B \-v\ \ \ \ \ Increment verbosity level, one level for each \-v found on the command line.
--- a/m_config.c Tue Jan 24 11:14:13 2006 +0000 +++ b/m_config.c Tue Jan 24 11:16:13 2006 +0000 @@ -13,12 +13,46 @@ #include "mp_msg.h" #include "help_mp.h" +#define MAX_PROFILE_DEPTH 20 + +static int +parse_profile(m_option_t* opt,char *name, char *param, void* dst, int src); + +static void +set_profile(m_option_t *opt, void* dst, void* src); + +static int +show_profile(m_option_t *opt, char* name, char *param); + +static void +m_config_add_option(m_config_t *config, m_option_t *arg, char* prefix); + m_config_t* m_config_new(void) { m_config_t* config; + static int inited = 0; + static m_option_type_t profile_opt_type; + static m_option_t ref_opts[] = { + { "profile", NULL, &profile_opt_type, CONF_NOSAVE, 0, 0, NULL }, + { "show-profile", show_profile, CONF_TYPE_PRINT_FUNC, CONF_NOCFG, 0, 0, NULL }, + { NULL, NULL, NULL, 0, 0, 0, NULL } + }; + int i; config = (m_config_t*)calloc(1,sizeof(m_config_t)); config->lvl = 1; // 0 Is the defaults + if(!inited) { + inited = 1; + profile_opt_type = m_option_type_string_list; + profile_opt_type.parse = parse_profile; + profile_opt_type.set = set_profile; + } + config->self_opts = malloc(sizeof(ref_opts)); + memcpy(config->self_opts,ref_opts,sizeof(ref_opts)); + for(i = 0 ; config->self_opts[i].name ; i++) + config->self_opts[i].priv = config; + m_config_register_options(config,config->self_opts); + return config; } @@ -26,6 +60,8 @@ m_config_free(m_config_t* config) { m_config_option_t *i = config->opts, *ct; m_config_save_slot_t *sl,*st; + m_profile_t *p,*pn; + int j; #ifdef MP_DEBUG assert(config != NULL); @@ -48,6 +84,18 @@ free(i); i = ct; } + for(p = config->profiles ; p ; p = pn) { + pn = p->next; + free(p->name); + if(p->desc) free(p->desc); + for(j = 0 ; j < p->num_opts ; j++) { + free(p->opts[2*j]); + if(p->opts[2*j+1]) free(p->opts[2*j+1]); + } + free(p->opts); + free(p); + } + free(config->self_opts); free(config); } @@ -381,3 +429,150 @@ } mp_msg(MSGT_FIXME, MSGL_FIXME, MSGTR_TotalOptions,count); } + +m_profile_t* +m_config_get_profile(m_config_t* config, char* name) { + m_profile_t* p; + for(p = config->profiles ; p ; p = p->next) + if(!strcmp(p->name,name)) return p; + return NULL; +} + +m_profile_t* +m_config_add_profile(m_config_t* config, char* name) { + m_profile_t* p = m_config_get_profile(config,name); + if(p) return p; + p = calloc(1,sizeof(m_profile_t)); + p->name = strdup(name); + p->next = config->profiles; + config->profiles = p; + return p; +} + +void +m_profile_set_desc(m_profile_t* p, char* desc) { + if(p->desc) free(p->desc); + p->desc = desc ? strdup(desc) : NULL; +} + +int +m_config_set_profile_option(m_config_t* config, m_profile_t* p, + char* name, char* val) { + int i = m_config_check_option(config,name,val); + if(i < 0) return i; + if(p->opts) p->opts = realloc(p->opts,2*(p->num_opts+2)*sizeof(char*)); + else p->opts = malloc(2*(p->num_opts+2)*sizeof(char*)); + p->opts[p->num_opts*2] = strdup(name); + p->opts[p->num_opts*2+1] = val ? strdup(val) : NULL; + p->num_opts++; + p->opts[p->num_opts*2] = p->opts[p->num_opts*2+1] = NULL; +} + +static void +m_config_set_profile(m_config_t* config, m_profile_t* p) { + int i; + if(config->profile_depth > MAX_PROFILE_DEPTH) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "WARNING: Too deep profile inclusion\n"); + return; + } + config->profile_depth++; + for(i = 0 ; i < p->num_opts ; i++) + m_config_set_option(config,p->opts[2*i],p->opts[2*i+1]); + config->profile_depth--; +} + +static int +parse_profile(m_option_t* opt,char *name, char *param, void* dst, int src) { + m_config_t* config = opt->priv; + char** list = NULL; + int i,r; + if(param && !strcmp(param,"help")) { + m_profile_t* p; + if(!config->profiles) { + mp_msg(MSGT_FIXME, MSGL_FIXME, "No profile have been defined.\n"); + return M_OPT_EXIT-1; + } + mp_msg(MSGT_FIXME, MSGL_FIXME, "Available profiles:\n"); + for(p = config->profiles ; p ; p = p->next) + mp_msg(MSGT_FIXME, MSGL_FIXME, "\t%s\t%s\n",p->name, + p->desc ? p->desc : ""); + mp_msg(MSGT_FIXME, MSGL_FIXME, "\n"); + return M_OPT_EXIT-1; + } + + r = m_option_type_string_list.parse(opt,name,param,&list,src); + if(r < 0) return r; + if(!list || !list[0]) return M_OPT_INVALID; + for(i = 0 ; list[i] ; i++) + if(!m_config_get_profile(config,list[i])) { + mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Unknown profile '%s'.\n", + list[i]); + r = M_OPT_INVALID; + } + if(dst) + m_option_copy(opt,dst,&list); + else + m_option_free(opt,&list); + return r; +} + +static void +set_profile(m_option_t *opt, void* dst, void* src) { + m_config_t* config = opt->priv; + m_profile_t* p; + char** list = NULL; + int i; + if(!src || !*(char***)src) return; + m_option_copy(opt,&list,src); + for(i = 0 ; list[i] ; i++) { + p = m_config_get_profile(config,list[i]); + if(!p) continue; + m_config_set_profile(config,p); + } + m_option_free(opt,&list); +} + +static int +show_profile(m_option_t *opt, char* name, char *param) { + m_config_t* config = opt->priv; + m_profile_t* p; + int i,j; + if(!param) return M_OPT_MISSING_PARAM; + if(!(p = m_config_get_profile(config,param))) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Unknown profile '%s'\n",param); + return M_OPT_EXIT-1; + } + if(!config->profile_depth) + mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Profile %s: %s\n",param, + p->desc ? p->desc : ""); + config->profile_depth++; + for(i = 0 ; i < p->num_opts ; i++) { + char spc[config->profile_depth+1]; + for(j = 0 ; j < config->profile_depth ; j++) + spc[j] = ' '; + spc[config->profile_depth] = '\0'; + + mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s%s=%s\n", spc, + p->opts[2*i], p->opts[2*i+1]); + + + if(config->profile_depth < MAX_PROFILE_DEPTH && + !strcmp(p->opts[2*i],"profile")) { + char* e,*list = p->opts[2*i+1]; + while((e = strchr(list,','))) { + int l = e-list; + char tmp[l+1]; + if(!l) continue; + memcpy(tmp,list,l); + tmp[l] = '\0'; + show_profile(opt,name,tmp); + list = e+1; + } + if(list[0] != '\0') + show_profile(opt,name,list); + } + } + config->profile_depth--; + if(!config->profile_depth) mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); + return M_OPT_EXIT-1; +}
--- a/m_config.h Tue Jan 24 11:14:13 2006 +0000 +++ b/m_config.h Tue Jan 24 11:16:13 2006 +0000 @@ -3,6 +3,7 @@ typedef struct m_config_option m_config_option_t; typedef struct m_config_save_slot m_config_save_slot_t; +typedef struct m_profile m_profile_t; struct m_option; struct m_option_type; @@ -22,10 +23,21 @@ unsigned int flags; // currently it only tell if the option was set }; +struct m_profile { + m_profile_t* next; + char* name; + char* desc; + int num_opts; + char** opts; +}; + typedef struct m_config { m_config_option_t* opts; int lvl; // Current stack level int mode; + m_profile_t* profiles; + int profile_depth; + struct m_option* self_opts; } m_config_t; #define M_CFG_OPT_SET (1<<0) @@ -61,4 +73,17 @@ void m_config_print_option_list(m_config_t *config); +m_profile_t* +m_config_get_profile(m_config_t* config, char* name); + +m_profile_t* +m_config_add_profile(m_config_t* config, char* name); + +void +m_profile_set_desc(m_profile_t* p, char* desc); + +int +m_config_set_profile_option(m_config_t* config, m_profile_t* p, + char* name, char* val); + #endif /* _M_CONFIG_H */
--- a/parser-cfg.c Tue Jan 24 11:14:13 2006 +0000 +++ b/parser-cfg.c Tue Jan 24 11:16:13 2006 +0000 @@ -37,6 +37,7 @@ int ret = 1; int errors = 0; int prev_mode = config->mode; + m_profile_t* profile = NULL; #ifdef MP_DEBUG assert(config != NULL); @@ -105,6 +106,16 @@ continue; } opt[opt_pos] = '\0'; + + /* Profile declaration */ + if(opt_pos > 2 && opt[0] == '[' && opt[opt_pos-1] == ']') { + opt[opt_pos-1] = '\0'; + if(strcmp(opt+1,"default")) + profile = m_config_add_profile(config,opt+1); + else + profile = NULL; + continue; + } #ifdef MP_DEBUG PRINT_LINENUM; @@ -184,7 +195,14 @@ ret = -1; } - tmp = m_config_set_option(config, opt, param); + if(profile) { + if(!strcmp(opt,"profile-desc")) + m_profile_set_desc(profile,param), tmp = 1; + else + tmp = m_config_set_profile_option(config,profile, + opt,param); + } else + tmp = m_config_set_option(config, opt, param); if (tmp < 0) { PRINT_LINENUM; if(tmp == M_OPT_UNKNOWN) {