ffmpeg 中 结构体初始化 的那些花样
2019-03-24 本文已影响0人
FlyingPenguin
https://blog.csdn.net/ericbar/article/details/79567108
https://blog.csdn.net/ericbar/article/details/79567108
花样1:
AVRational 是一个表示有理数的结构体。
/**
* Rational number (pair of numerator and denominator).
*/
typedef struct AVRational{
int num; ///< Numerator
int den; ///< Denominator
} AVRational;
其实当num=1,den=1000的时候pts的时间单位就相当于毫秒 1/1000秒
其实当num=1,den=1000000的时候pts的时间单位就相当于微秒 1/1000000秒
AVRational 最常用的初始化套路是这样的:
enc_ctx->time_base = (AVRational){1,25}; // meaningless
这种方式的特例:
/**
* Internal time base represented as integer
*/
#define AV_TIME_BASE 1000000
/**
* Internal time base represented as fractional value
*/
#define AV_TIME_BASE_Q (AVRational){1, AV_TIME_BASE}
花样2 (清晰):
fs->time_base.num = 1;
fs->time_base.den = AV_TIME_BASE;
花样3:
static const AVRational avf_time_base_q = {
.num = 1,
.den = avf_time_base
};
AVPacket packet = { .data = NULL, .size = 0 };
再比如:
AVFilter的定义是这样的:
/**
* Filter definition. This defines the pads a filter contains, and all the
* callback functions used to interact with the filter.
*/
typedef struct AVFilter {
/**
* Filter name. Must be non-NULL and unique among filters.
*/
const char *name;
/**
* A description of the filter. May be NULL.
*
* You should use the NULL_IF_CONFIG_SMALL() macro to define it.
*/
const char *description;
/**
* List of inputs, terminated by a zeroed element.
*
* NULL if there are no (static) inputs. Instances of filters with
* AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in
* this list.
*/
const AVFilterPad *inputs;
/**
* List of outputs, terminated by a zeroed element.
*
* NULL if there are no (static) outputs. Instances of filters with
* AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in
* this list.
*/
const AVFilterPad *outputs;
/**
* A class for the private data, used to declare filter private AVOptions.
* This field is NULL for filters that do not declare any options.
*
* If this field is non-NULL, the first member of the filter private data
* must be a pointer to AVClass, which will be set by libavfilter generic
* code to this class.
*/
const AVClass *priv_class;
/**
* A combination of AVFILTER_FLAG_*
*/
int flags;
...
int (*activate)(AVFilterContext *ctx);
} AVFilter;
初始化的套路是这样的,这也是最具c风格的初始化:
AVFilter ff_vf_fps = {
.name = "fps",
.description = NULL_IF_CONFIG_SMALL("Force constant framerate."),
.init = init,
.uninit = uninit,
.priv_size = sizeof(FPSContext),
.priv_class = &fps_class,
.activate = activate,
.inputs = avfilter_vf_fps_inputs,
.outputs = avfilter_vf_fps_outputs,
};
References:
https://blog.csdn.net/ericbar/article/details/79567108
https://blog.51cto.com/xiacaojun/1958680