背景

AVOption 可能用到很多地方,本文只解析编码器设置其支持的编码器参数的 options。

正文

AVOption 结构

typedef struct AVOption {const char *name;// 名字/** * short English help text * @todo What about other languages? */const char *help; // 简介/** * The offset relative to the context structure where the option * value is stored. It should be 0 for named constants. */int offset; // 偏移量,如果该 option 是常量则为0enum AVOptionType type; // /** * the default value for scalar options */union {int64_t i64;double dbl;const char *str;/* TODO those are unused now */AVRational q;} default_val;double min; ///< minimum valid value for the optiondouble max; ///< maximum valid value for the optionint flags;#define AV_OPT_FLAG_ENCODING_PARAM1 ///< a generic parameter which can be set by the user for muxing or encoding#define AV_OPT_FLAG_DECODING_PARAM2 ///< a generic parameter which can be set by the user for demuxing or decoding#define AV_OPT_FLAG_AUDIO_PARAM 8#define AV_OPT_FLAG_VIDEO_PARAM 16#define AV_OPT_FLAG_SUBTITLE_PARAM32/** * The option is intended for exporting values to the caller. */#define AV_OPT_FLAG_EXPORT64/** * The option may not be set through the AVOptions API, only read. * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set. */#define AV_OPT_FLAG_READONLY128#define AV_OPT_FLAG_BSF_PARAM (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering#define AV_OPT_FLAG_RUNTIME_PARAM (1<<15) ///< a generic parameter which can be set by the user at runtime#define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering#define AV_OPT_FLAG_DEPRECATED(1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information#define AV_OPT_FLAG_CHILD_CONSTS(1<<18) ///< set if option constants can also reside in child objects//FIXME think about enc-audio, ... style flags/** * The logical unit to which the option belongs. Non-constant * options and corresponding named constants share the same * unit. May be NULL. */const char *unit;} AVOption;

进一步解析

  1. 目前感觉 AVOption 主要可以分成两类,一类是常量 option,一类是变量 option。
    a. 常量 option
    type 为 AV_OPT_TYPE_CONST
    offset 为 0
    作为变量 option
    b.举例
    使用 x264 部分代码举例
{ "stats", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, { 0 },0, 0, VE },{ "nal-hrd", "Signal HRD information (requires vbv-bufsize; " "cbr not allowed in .mp4)",OFFSET(nal_hrd), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "nal-hrd" },{ "none",NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_NONE}, INT_MIN, INT_MAX, VE, "nal-hrd" },{ "vbr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_VBR},INT_MIN, INT_MAX, VE, "nal-hrd" },{ "cbr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_CBR},INT_MIN, INT_MAX, VE, "nal-hrd" },

可以发现 nal-hrd 类型是 AV_OPT_TYPE_INT, unit 为 “nal-hrd”,说明这个变量需要用其他 unit 为 “nal-hrd” 的常量 AVOption 作为参数。
“none”、“vbr”、“cbr” 这些类型是是AV_OPT_TYPE_CONST, unit 为 “nal-hrd”,可以作为 nal-hrd 具体的值传入。
“stats” 这个变量,不需要通过其他 AVOption 作为参数,所以其 unit 没有设置。

P.S.

上面的结论只是个人看法不一定对。