X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fopt.c;h=0bdef5c984aeabffa248e483e1215e855f3b6e68;hb=eabb0ac38e3da2976ab250274fea2ae1e97da8c5;hp=80770549b965125e6dd3a50c72f596c8b2eda88f;hpb=637b5326f3441b53e2f1004085c4d570ba2d7758;p=ffmpeg diff --git a/libavcodec/opt.c b/libavcodec/opt.c index 80770549b96..0bdef5c984a 100644 --- a/libavcodec/opt.c +++ b/libavcodec/opt.c @@ -14,18 +14,19 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ - + /** * @file opt.c * AVOptions * @author Michael Niedermayer */ - + #include "avcodec.h" - +#include "opt.h" + static double av_parse_num(const char *name, char **tail){ double d; d= strtod(name, tail); @@ -38,7 +39,7 @@ static double av_parse_num(const char *name, char **tail){ static AVOption *find_opt(void *v, const char *name, const char *unit){ AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass AVOption *o= c->option; - + for(;o && o->name; o++){ if(!strcmp(o->name, name) && (!unit || !strcmp(o->unit, unit)) ) return o; @@ -55,16 +56,16 @@ AVOption *av_next_option(void *obj, AVOption *last){ static AVOption *av_set_number(void *obj, const char *name, double num, int den, int64_t intnum){ AVOption *o= find_opt(obj, name, NULL); void *dst; - if(!o || o->offset<=0) + if(!o || o->offset<=0) return NULL; - + if(o->max*den < num*intnum || o->min*den > num*intnum) return NULL; - + dst= ((uint8_t*)obj) + o->offset; switch(o->type){ - case FF_OPT_TYPE_FLAGS: + case FF_OPT_TYPE_FLAGS: case FF_OPT_TYPE_INT: *(int *)dst= lrintf(num/den)*intnum; break; case FF_OPT_TYPE_INT64: *(int64_t *)dst= lrintf(num/den)*intnum; break; case FF_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break; @@ -82,7 +83,7 @@ static AVOption *set_all_opt(void *v, const char *unit, double d){ AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass AVOption *o= c->option; AVOption *ret=NULL; - + for(;o && o->name; o++){ if(o->type != FF_OPT_TYPE_CONST && o->unit && !strcmp(o->unit, unit)){ double tmp= d; @@ -102,7 +103,7 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){ if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){ return set_all_opt(obj, o->unit, o->default_val); } - if(!o || !val || o->offset<=0) + if(!o || !val || o->offset<=0) return NULL; if(o->type != FF_OPT_TYPE_STRING){ for(;;){ @@ -113,16 +114,16 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){ if(*val == '+' || *val == '-') cmd= *(val++); - + for(i=0; iunit); - if(o_named && o_named->type == FF_OPT_TYPE_CONST) + if(o_named && o_named->type == FF_OPT_TYPE_CONST) d= o_named->default_val; else if(!strcmp(buf, "default")) d= o->default_val; else if(!strcmp(buf, "max" )) d= o->max; @@ -141,7 +142,7 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){ } return NULL; } - + memcpy(((uint8_t*)obj) + o->offset, val, sizeof(val)); return o; } @@ -159,7 +160,7 @@ AVOption *av_set_int(void *obj, const char *name, int64_t n){ } /** - * + * * @param buf a buffer which is used for returning non string values as strings, can be NULL * @param buf_len allocated length in bytes of buf */ @@ -173,14 +174,14 @@ const char *av_get_string(void *obj, const char *name, AVOption **o_out, char *b dst= ((uint8_t*)obj) + o->offset; if(o_out) *o_out= o; - + if(o->type == FF_OPT_TYPE_STRING) return dst; - + switch(o->type){ case FF_OPT_TYPE_FLAGS: snprintf(buf, buf_len, "0x%08X",*(int *)dst);break; case FF_OPT_TYPE_INT: snprintf(buf, buf_len, "%d" , *(int *)dst);break; - case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%Ld", *(int64_t*)dst);break; + case FF_OPT_TYPE_INT64: snprintf(buf, buf_len, "%"PRId64, *(int64_t*)dst);break; case FF_OPT_TYPE_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break; case FF_OPT_TYPE_DOUBLE: snprintf(buf, buf_len, "%f" , *(double *)dst);break; case FF_OPT_TYPE_RATIONAL: snprintf(buf, buf_len, "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; @@ -200,12 +201,12 @@ static int av_get_number(void *obj, const char *name, AVOption **o_out, double * if(o_out) *o_out= o; switch(o->type){ - case FF_OPT_TYPE_FLAGS: + case FF_OPT_TYPE_FLAGS: case FF_OPT_TYPE_INT: *intnum= *(int *)dst;return 0; case FF_OPT_TYPE_INT64: *intnum= *(int64_t*)dst;return 0; case FF_OPT_TYPE_FLOAT: *num= *(float *)dst;return 0; case FF_OPT_TYPE_DOUBLE: *num= *(double *)dst;return 0; - case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; + case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; *den = ((AVRational*)dst)->den; return 0; } @@ -246,7 +247,7 @@ int64_t av_get_int(void *obj, const char *name, AVOption **o_out){ int av_opt_show(void *obj, void *av_log_obj){ AVOption *opt=NULL; - + if(!obj) return -1; @@ -255,15 +256,46 @@ int av_opt_show(void *obj, void *av_log_obj){ while((opt= av_next_option(obj, opt))){ if(!(opt->flags & (AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM))) continue; - + av_log(av_log_obj, AV_LOG_INFO, "-%-17s ", opt->name); + + switch( opt->type ) + { + case FF_OPT_TYPE_FLAGS: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_INT: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_INT64: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_DOUBLE: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_FLOAT: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_STRING: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_RATIONAL: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + case FF_OPT_TYPE_CONST: + default: + av_log( av_log_obj, AV_LOG_INFO, "%-7s ", "" ); + break; + } av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_ENCODING_PARAM) ? 'E' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_DECODING_PARAM) ? 'D' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_VIDEO_PARAM ) ? 'V' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_AUDIO_PARAM ) ? 'A' : '.'); av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) ? 'S' : '.'); - - av_log(av_log_obj, AV_LOG_INFO, " %s\n", opt->help); + + if(opt->help) + av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help); + av_log(av_log_obj, AV_LOG_INFO, "\n"); } return 0; }