mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
flags and named constants with type checking of course for AVOption
spliting AVOption specific stuff out of avcodec.h into opt.h Originally committed as revision 4581 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
8bbf6db98b
commit
233f6f889e
@ -12,6 +12,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "avutil.h"
|
||||
#include "opt.h"
|
||||
#include <sys/types.h> /* size_t */
|
||||
|
||||
//FIXME the following 2 really dont belong in here
|
||||
@ -671,44 +672,6 @@ typedef struct AVFrame {
|
||||
|
||||
#define DEFAULT_FRAME_RATE_BASE 1001000
|
||||
|
||||
enum AVOptionType{
|
||||
FF_OPT_TYPE_INT,
|
||||
FF_OPT_TYPE_INT64,
|
||||
FF_OPT_TYPE_DOUBLE,
|
||||
FF_OPT_TYPE_FLOAT,
|
||||
FF_OPT_TYPE_STRING,
|
||||
FF_OPT_TYPE_RATIONAL,
|
||||
FF_OPT_TYPE_CONST=128,
|
||||
};
|
||||
|
||||
/**
|
||||
* AVOption.
|
||||
*/
|
||||
typedef struct AVOption {
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* short English text help.
|
||||
* @fixme what about other languages
|
||||
*/
|
||||
const char *help;
|
||||
int offset; ///< offset to context structure where the parsed value should be stored
|
||||
enum AVOptionType type;
|
||||
|
||||
double default_val;
|
||||
double min;
|
||||
double max;
|
||||
|
||||
int flags;
|
||||
#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding
|
||||
#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding
|
||||
#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ...
|
||||
#define AV_OPT_FLAG_AUDIO_PARAM 8
|
||||
#define AV_OPT_FLAG_VIDEO_PARAM 16
|
||||
#define AV_OPT_FLAG_SUBTITLE_PARAM 32
|
||||
//FIXME think about enc-audio, ... style flags
|
||||
} AVOption;
|
||||
|
||||
/**
|
||||
* Used by av_log
|
||||
*/
|
||||
@ -1887,17 +1850,6 @@ typedef struct AVCodecContext {
|
||||
enum AVDiscard skip_frame;
|
||||
} AVCodecContext;
|
||||
|
||||
AVOption *av_set_string(void *obj, const char *name, const char *val);
|
||||
AVOption *av_set_double(void *obj, const char *name, double n);
|
||||
AVOption *av_set_q(void *obj, const char *name, AVRational n);
|
||||
AVOption *av_set_int(void *obj, const char *name, int64_t n);
|
||||
double av_get_double(void *obj, const char *name, AVOption **o_out);
|
||||
AVRational av_get_q(void *obj, const char *name, AVOption **o_out);
|
||||
int64_t av_get_int(void *obj, const char *name, AVOption **o_out);
|
||||
const char *av_get_string(void *obj, const char *name, AVOption **o_out, char *buf, int buf_len);
|
||||
AVOption *av_next_option(void *obj, AVOption *last);
|
||||
int av_opt_show(void *obj, FILE *f);
|
||||
|
||||
/**
|
||||
* AVCodec.
|
||||
*/
|
||||
|
@ -64,6 +64,7 @@ static AVOption *av_set_number(void *obj, const char *name, double num, int den,
|
||||
dst= ((uint8_t*)obj) + o->offset;
|
||||
|
||||
switch(o->type){
|
||||
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;
|
||||
@ -83,32 +84,39 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){
|
||||
if(!o || !val || o->offset<=0)
|
||||
return NULL;
|
||||
if(o->type != FF_OPT_TYPE_STRING){
|
||||
double d=0, tmp_d;
|
||||
for(;;){
|
||||
int i;
|
||||
char buf[256], *tail;
|
||||
int cmd=0;
|
||||
double d;
|
||||
|
||||
for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+'; i++)
|
||||
if(*val == '+' || *val == '-')
|
||||
cmd= *(val++);
|
||||
|
||||
for(i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
|
||||
buf[i]= val[i];
|
||||
buf[i]=0;
|
||||
val+= i;
|
||||
|
||||
tmp_d= av_parse_num(buf, &tail);
|
||||
if(tail > buf)
|
||||
d+= tmp_d;
|
||||
else{
|
||||
d= av_parse_num(buf, &tail);
|
||||
if(tail <= buf){
|
||||
AVOption *o_named= find_opt(obj, buf);
|
||||
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;
|
||||
else if(!strcmp(buf, "min" )) d+= o->min;
|
||||
if(o_named && o_named->type == FF_OPT_TYPE_CONST && !strcmp(o_named->unit, o->unit))
|
||||
d= o_named->default_val;
|
||||
else if(!strcmp(buf, "default")) d= o->default_val;
|
||||
else if(!strcmp(buf, "max" )) d= o->max;
|
||||
else if(!strcmp(buf, "min" )) d= o->min;
|
||||
else return NULL;
|
||||
}
|
||||
if(o->type == FF_OPT_TYPE_FLAGS){
|
||||
if (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
|
||||
else if(cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
|
||||
}else if(cmd=='-')
|
||||
d= -d;
|
||||
|
||||
if(*val == '+') val++;
|
||||
av_set_number(obj, name, d, 1, 1);
|
||||
if(!*val)
|
||||
return av_set_number(obj, name, d, 1, 1);
|
||||
return o;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -149,6 +157,7 @@ const char *av_get_string(void *obj, const char *name, AVOption **o_out, char *b
|
||||
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_FLOAT: snprintf(buf, buf_len, "%f" , *(float *)dst);break;
|
||||
@ -170,6 +179,7 @@ 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_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;
|
||||
|
61
libavcodec/opt.h
Normal file
61
libavcodec/opt.h
Normal file
@ -0,0 +1,61 @@
|
||||
#ifndef AVOPT_H
|
||||
#define AVOPT_H
|
||||
|
||||
/**
|
||||
* @file opt.h
|
||||
* AVOptions
|
||||
*/
|
||||
|
||||
enum AVOptionType{
|
||||
FF_OPT_TYPE_FLAGS,
|
||||
FF_OPT_TYPE_INT,
|
||||
FF_OPT_TYPE_INT64,
|
||||
FF_OPT_TYPE_DOUBLE,
|
||||
FF_OPT_TYPE_FLOAT,
|
||||
FF_OPT_TYPE_STRING,
|
||||
FF_OPT_TYPE_RATIONAL,
|
||||
FF_OPT_TYPE_CONST=128,
|
||||
};
|
||||
|
||||
/**
|
||||
* AVOption.
|
||||
*/
|
||||
typedef struct AVOption {
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* short English text help.
|
||||
* @fixme what about other languages
|
||||
*/
|
||||
const char *help;
|
||||
int offset; ///< offset to context structure where the parsed value should be stored
|
||||
enum AVOptionType type;
|
||||
|
||||
double default_val;
|
||||
double min;
|
||||
double max;
|
||||
|
||||
int flags;
|
||||
#define AV_OPT_FLAG_ENCODING_PARAM 1 ///< a generic parameter which can be set by the user for muxing or encoding
|
||||
#define AV_OPT_FLAG_DECODING_PARAM 2 ///< a generic parameter which can be set by the user for demuxing or decoding
|
||||
#define AV_OPT_FLAG_METADATA 4 ///< some data extracted or inserted into the file like title, comment, ...
|
||||
#define AV_OPT_FLAG_AUDIO_PARAM 8
|
||||
#define AV_OPT_FLAG_VIDEO_PARAM 16
|
||||
#define AV_OPT_FLAG_SUBTITLE_PARAM 32
|
||||
//FIXME think about enc-audio, ... style flags
|
||||
const char *unit;
|
||||
} AVOption;
|
||||
|
||||
|
||||
AVOption *av_set_string(void *obj, const char *name, const char *val);
|
||||
AVOption *av_set_double(void *obj, const char *name, double n);
|
||||
AVOption *av_set_q(void *obj, const char *name, AVRational n);
|
||||
AVOption *av_set_int(void *obj, const char *name, int64_t n);
|
||||
double av_get_double(void *obj, const char *name, AVOption **o_out);
|
||||
AVRational av_get_q(void *obj, const char *name, AVOption **o_out);
|
||||
int64_t av_get_int(void *obj, const char *name, AVOption **o_out);
|
||||
const char *av_get_string(void *obj, const char *name, AVOption **o_out, char *buf, int buf_len);
|
||||
AVOption *av_next_option(void *obj, AVOption *last);
|
||||
int av_opt_show(void *obj, FILE *f);
|
||||
|
||||
#endif
|
@ -447,9 +447,12 @@ static const char* context_to_name(void* ptr) {
|
||||
static AVOption options[]={
|
||||
{"bit_rate", NULL, OFFSET(bit_rate), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|A|E},
|
||||
{"bit_rate_tolerance", NULL, OFFSET(bit_rate_tolerance), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"flags", NULL, OFFSET(flags), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX}, //FIXME
|
||||
{"flags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, V|E, "flags"},
|
||||
{"MV4", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_4MV, INT_MIN, INT_MAX, V|E, "flags"},
|
||||
{"OBMC", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_OBMC, INT_MIN, INT_MAX, V|E, "flags"},
|
||||
{"QPEL", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_QPEL, INT_MIN, INT_MAX, V|E, "flags"},
|
||||
{"sub_id", NULL, OFFSET(sub_id), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
|
||||
{"me_method", NULL, OFFSET(me_method), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"me_method", NULL, OFFSET(me_method), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "me_method"},
|
||||
{"extradata_size", NULL, OFFSET(extradata_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
|
||||
{"time_base", NULL, OFFSET(time_base), FF_OPT_TYPE_RATIONAL, DEFAULT, INT_MIN, INT_MAX},
|
||||
{"gop_size", NULL, OFFSET(gop_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
@ -519,7 +522,8 @@ static AVOption options[]={
|
||||
{"bits_per_sample", NULL, OFFSET(bits_per_sample), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
|
||||
{"prediction_method", NULL, OFFSET(prediction_method), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"aspect", NULL, OFFSET(sample_aspect_ratio), FF_OPT_TYPE_RATIONAL, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"debug", NULL, OFFSET(debug), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|A|S|E|D},
|
||||
{"debug", NULL, OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, V|A|S|E|D, "debug"},
|
||||
{"PICT", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_PICT_INFO, INT_MIN, INT_MAX, V|E, "debug"},
|
||||
{"debug_mv", NULL, OFFSET(debug_mv), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D},
|
||||
{"mb_qmin", NULL, OFFSET(mb_qmin), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
{"mb_qmax", NULL, OFFSET(mb_qmax), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
|
||||
|
Loading…
Reference in New Issue
Block a user