FFMPEG学习【libavutil】:数据结构(三)

FFMPEG中libavutil的软件架构是怎么样的?如何使用? libavutil` 是 FFmpeg 项目中的一个支持库,它提供了一系列公共的实用函数和数据结构,这些函数和数据结构在 FFmpeg 的其他组件中广泛使用。`libavutil` 的目的是为编解码器、格式处理和过滤器提供通用的功能,以避免代码重复。 阅读详情

AVOptions提供了一个通用的系统来声明任意结构(“对象”)上的选项。

一个选项可以有一个帮助文本,一个类型和一系列可能的值。 然后可以枚举,读取和写入选项。


Implementing AVOptions

本节介绍如何向结构体添加AVOptions功能。

所有AVOptions相关信息都存储在AVClass中。 因此,struct的第一个成员应该是一个指向描述它的AVClass的指针。 AVClass的选项字段必须设置为一个以NULL结尾的AVOptions的静态数组。 每个AVOption必须具有非空名称,类型,默认值和数字类型AVOptions也是允许值的范围。 它还必须从结构的开始处声明一个以字节为单位的偏移量,其中与此AVOption相关联的字段位于该位置。 AVOption结构中的其他字段也应在适用时进行设置,但不是必需的。

以下示例说明了支持AVOptions的结构:

typedef struct test_struct {
    const AVClass *class;
    int      int_opt;
    char    *str_opt;
    uint8_t *bin_opt;
    int      bin_len;
} test_struct;
static const AVOption test_options[] = {
  { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
    AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX },
  { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
    AV_OPT_TYPE_STRING },
  { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
    AV_OPT_TYPE_BINARY },
  { NULL },
};
static const AVClass test_class = {
    .class_name = "test class",
    .item_name  = av_default_item_name,
    .option     = test_options,
    .version    = LIBAVUTIL_VERSION_INT,
};

接下来,分配你的结构时,你必须确保AVClass指针被设置为正确的值。 然后,可以调用av_opt_set_defaults()来初始化默认值。 之后,该结构就可以与AVOptions API一起使用了。

清理时,您可以使用av_opt_free()函数自动释放所有分配的字符串和二进制选项。

继续以上示例:

test_struct *alloc_test_struct(void)
{
    test_struct *ret = av_mallocz(sizeof(*ret));
    ret->class = &test_class;
    av_opt_set_defaults(ret);
    return ret;
}
void free_test_struct(test_struct **foo)
{
    av_opt_free(*foo);
    av_freep(foo);
}


Nesting

可能会发生一个AVOptions启用的结构包含另一个支持AVOptions的结构作为成员(例如,libavcodec中的AVCodecContext导出通用选项,而其priv_data字段导出编解码器特定的选项)。 在这种情况下,可以设置父结构以导出子选项。 要做到这一点,只需在父结构的AVClass中实现AVClass.child_next()和AVClass.child_class_next()。 假设来自上面的test_struct现在还包含一个child_struct字段:

typedef struct child_struct {
    AVClass *class;
    int flags_opt;
} child_struct;
static const AVOption child_opts[] = {
    { "test_flags", "This is a test option of flags type.",
      offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },
    { NULL },
};
static const AVClass child_class = {
    .class_name = "child class",
    .item_name  = av_default_item_name,
    .option     = child_opts,
    .version    = LIBAVUTIL_VERSION_INT,
};
void *child_next(void *obj, void *prev)
{
    test_struct *t = obj;
    if (!prev && t->child_struct)
        return t->child_struct;
    return NULL
}
const AVClass child_class_next(const AVClass *prev)
{
    return prev ? NULL : &child_class;

将上面定义的child_next()和child_class_next()放在test_class中,现在可以通过test_struct访问child_struct的选项(再次,在创建之后,需要在child_struct上完成上述的正确设置)。

从上面的例子可能不清楚为什么需要child_next()和child_class_next()。 区别在于child_next()迭代实际存在的对象,而child_class_next()遍历所有可能的子类。 例如。 如果AVCodecContext被初始化为使用具有私有选项的编解码器,那么它的child_next()将返回AVCodecContext.priv_data并完成迭代。 AVCodecContext.av_class上的OTOH child_class_next()将使用私有选项来迭代所有可用的编解码器。


Named constants

可以为选项创建命名常量。 只需将选项的单位字段设置为常量应用于字符串,并将常量自身创建为类型为AV_OPT_TYPE_CONST的选项,其单位字段设置为相同的字符串。 它们的default_val字段应包含命名常量的值。 例如,要为上面的test_flags选项添加一些命名常量,请将以下内容放入child_opts数组中:

{ "test_flags", "This is a test option of flags type.",
  offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" },
{ "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" },

Using AVOptions

本节介绍在支持AVOptions的结构中访问选项。 FFmpeg中的这样的结构是例如。 libavcodec中的AVCodecContext或libavformat中的AVFormatContext。


Examining AVOptions

检查选项的基本功能是av_opt_next(),它遍历为一个对象定义的所有选项,av_opt_find()将搜索给定名称的选项。

嵌套情况更复杂。 支持AVOptions的结构可能具有启用AVOptions的子项。 将AV_OPT_SEARCH_CHILDREN标志传递给av_opt_find()将使函数递归地搜索子项。

列举基本上有两种情况。 第一个是当您想要获取结构体及其子代中可能存在的所有选项(例如构建文档时)。 在这种情况下,您应该在父结构的AVClass上递归调用av_opt_child_class_next()。 第二种情况是当你有一个已经初始化的结构与所有的孩子,你想获得所有可以实际写入或读取的选项。 在这种情况下,您应该在每个结果上递归调用av_opt_child_next()(和av_opt_next())。


Reading and writing AVOptions

设置选项时,您通常会直接从用户读取字符串。 在这种情况下,只需将其传递给av_opt_set()即可。 对于非字符串类型选项,av_opt_set()将根据选项类型解析字符串。

类似地,av_opt_get()将读取任何选项类型并将其转换为将被返回的字符串。 不要忘记字符串被分配,所以你必须用av_free()释放它。

在某些情况下,将所有选项放入AVDictionary并调用av_opt_set_dict()可能会更为方便。 一个具体的例子是lavf / lavc中的格式/编解码器打开功能,它使用填充了选项的字典作为参数。 这使得可以设置不能另外设置的一些选项,因为例如 在文件实际打开之前,输入文件格式是不知道的。



一、模块

一)、Evaluating option strings

这组函数可用于评估选项字符串并从中获取数字。

它们与av_opt_set()执行相同的操作,除了将结果写入到调用者提供的指针中。

参数:obj:一个结构体,其第一个元素是指向AVClass的指针。

   o:要评估字符串的选项。

   val:要评估的字符串。

   *_val:字符串的值将写在这里。

返回:0成功,负数为失败。


函数

int  av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out)

int  av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out)

int  av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out)

int  av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out)

int  av_opt_eval_double (void *obj, const AVOption *o, const char *val, double *double_out)

int  av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational *q_out)


二)、Option setting functions

那些函数将给定名称的obj的字段设置为value。

参数:obj:一个结构,其第一个元素是指向AVClass的指针。

   name:要设置的字段的名称

   val:要设置的值。 如果av_opt_set()如果字段不是字符串类型,则会解析给定的字符串。 支持SI后缀和一些命名标量。 如果字段是数字类型,则必须是数字或命名标量。 具有多个标量和+ - 中缀运算符的行为未定义。 如果该字段是一个标志类型,它必须是一个数字标量或命名标记的序列,以'+'或' - '分隔。 用'+'替代标志会导致设置不影响其他标志; 同样地,' - '取消标志。

   search_flags:标志传递给av_opt_find2。即 如果AV_OPT_SEARCH_CHILDREN被传递到这里,那么可以在obj的子对象上设置该选项。

返回:如果值已设置,则为0,如果出现错误,则为AVERROR代码:AVERROR_OPTION_NOT_FOUND(如果不存在匹配选项)AVERROR(ERANGE)如果值超出范围AVERROR(EINVAL),如果该值无效


宏

#define  av_opt_set_int_list(obj, name, val, term, flags)
将二进制选项设置为整数列表。

参数:obj:AVClass对象设置选项

   name:二进制选项的名称

   val:指向整数列表的指针(对于列表的内容,必须具有正确的类型)

   term:列表终止符(通常为0或-1)

   flags:搜索标志


函数

int  av_opt_set (void *obj, const char *name, const char *val, int search_flags)

int  av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags)


int  av_opt_set_double (void *obj, const char *name, double val, int search_flags)

int  av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags)
 

int  av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags)

int  av_opt_set_image_size (void *obj, const char *name, int w, int h, int search_flags)

int  av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags)

int  av_opt_set_sample_fmt (void *obj, const char *name, enum AVSampleFormat fmt, int search_flags)

int  av_opt_set_video_rate (void *obj, const char *name, AVRational val, int search_flags)

int  av_opt_set_channel_layout (void *obj, const char *name, int64_t ch_layout, int search_flags)

int  av_opt_set_dict_val (void *obj, const char *name, const AVDictionary *val, int search_flags)


三)、Option getting functions

那些函数从对象获取给定名称的选项的值。

参数:obj:一个结构体,其第一个元素是指向AVClass的指针。

   name:获取的选项的名称。

   search_flags:标志传递给av_opt_find2。即 如果AV_OPT_SEARCH_CHILDREN在这里被传递,那么该选项可能在obj的一个小孩中找到。

   out_val:该选项的值将在此处写入

返回:> = 0成功,否则为否定错误代码


函数

int  av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val)
注意:返回的字符串将被av_malloc()编译,并且必须由调用者编写av_free()
如果av_opt_get中的search_flags中设置了AV_OPT_ALLOW_NULL,并且该选项具有AV_OPT_TYPE_STRING或AV_OPT_TYPE_BINARY,并将其设置为NULL,则out_val将被设置为NULL,而不是分配的空字符串。


int  av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val)

int  av_opt_get_double (void *obj, const char *name, int search_flags, double *out_val)

int  av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val)

int  av_opt_get_image_size (void *obj, const char *name, int search_flags, int *w_out, int *h_out)

int  av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt)

int  av_opt_get_sample_fmt (void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt)

int  av_opt_get_video_rate (void *obj, const char *name, int search_flags, AVRational *out_val)

int  av_opt_get_channel_layout (void *obj, const char *name, int search_flags, int64_t *ch_layout)

int  av_opt_get_dict_val (void *obj, const char *name, int search_flags, AVDictionary **out_val)



二、数据结构

struct   AVOption{
const char * name;
const char * help;//  短英文帮助文本
int offset; //相对于存储选项值的上下文结构的偏移量。 
enum AVOptionType type;
union {
   int64_t   i64 
   double   dbl
   const char *   str
   AVRational   q
} default_val //标量选项的默认值
double min; //  选项的最小有效值
double max; //  选项的最大有效值
int flags;
const char * unit;//选项所属的逻辑单位。
}

struct   AVOptionRange{
const char * str;
double value_min;//价值范围。
double value_max;
double component_min;//价值的组成范围。
double component_max;
int is_range; //范围标志。
}

struct   AVOptionRanges{
AVOptionRange ** range;//选项范围数组。
int nb_ranges;//每个组件的范围数。
int nb_components;//组件数量
}



三、宏

#define  AV_OPT_SEARCH_CHILDREN   (1 << 0)
首先在给定对象的可能孩子中搜索。


#define  AV_OPT_SEARCH_FAKE_OBJ   (1 << 1)
传递给av_opt_find()的obj是假的 - 只有一个指向AVClass的双指针,而不是指向包含AVClass的结构的必需指针。


#define  AV_OPT_ALLOW_NULL   (1 << 2)
在av_opt_get中,如果该选项具有指针类型并返回NULL,而不是返回一个空字符串。


#define  AV_OPT_MULTI_COMPONENT_RANGE   (1 << 12)
允许av_opt_query_ranges和av_opt_query_ranges_default为某些选项类型返回多个组件。


#define  AV_OPT_SERIALIZE_SKIP_DEFAULTS   0x00000001
序列化未设置为只默认值的选项。


#define  AV_OPT_SERIALIZE_OPT_FLAGS_EXACT   0x00000002
序列化与opt_flags完全匹配的选项。



四、枚举

enum   AVOptionType { 
  AV_OPT_TYPE_FLAGS, AV_OPT_TYPE_INT, AV_OPT_TYPE_INT64, AV_OPT_TYPE_DOUBLE, 
  AV_OPT_TYPE_FLOAT, AV_OPT_TYPE_STRING, AV_OPT_TYPE_RATIONAL, AV_OPT_TYPE_BINARY, 
  AV_OPT_TYPE_DICT, AV_OPT_TYPE_UINT64, AV_OPT_TYPE_CONST = 128, AV_OPT_TYPE_IMAGE_SIZE = MKBETAG('S','I','Z','E'), 
  AV_OPT_TYPE_PIXEL_FMT = MKBETAG('P','F','M','T'), AV_OPT_TYPE_SAMPLE_FMT = MKBETAG('S','F','M','T'), AV_OPT_TYPE_VIDEO_RATE = MKBETAG('V','R','A','T'),AV_OPT_TYPE_DURATION = MKBETAG('D','U','R',' '), 
  AV_OPT_TYPE_COLOR = MKBETAG('C','O','L','R'), AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'), AV_OPT_TYPE_BOOL = MKBETAG('B','O','O','L') 
}

enum   { AV_OPT_FLAG_IMPLICIT_KEY = 1 }


五、函数

int  av_opt_show2 (void *obj, void *av_log_obj, int req_flags, int rej_flags)
显示对象选项。

参数:av_log_obj:用于显示选项的日志上下文

   req_flags :请求显示选项的标志。 只显示它的选项 - > flags&req_flags。

   rej_flags:拒绝标记的选项显示。 只显示它的选项!(opt-> flags&req_flags)。


void  av_opt_set_defaults (void *s)
将所有AVOption字段的值设置为其默认值。

参数:s:一个支持Option的结构(它的第一个成员必须是A类的指针)


void  av_opt_set_defaults2 (void *s, int mask, int flags)
将所有AVOption字段的值设置为其默认值。

只有这些AVOption字段(opt-> flags&mask)==标志将其默认值应用于s。

参数:s:一个支持Option的结构(它的第一个成员必须是A类的指针)

   mask:AV_OPT_FLAG_ *的组合

   flags:AV_OPT_FLAG_ *的组合



int  av_set_options_string (void *ctx, const char *opts, const char *key_val_sep, const char *pairs_sep)
解析opts中的键/值对列表。

对于找到的每个键/值对,将值存储在ctx中的字段中,名称类似于键。 ctx必须是AVClass上下文,使用AVOptions进行存储。

参数:opts:选项字符串进行解析,可能为NULL

   key_val_sep:一个0个终止的字符列表,用于将值与值分离

   pairs_sep:用于将两个对彼此分离的0个字符的字符列表

返回:成功设置密钥/值对的数量,或与错误:AVERROR(EINVAL)相对应的AVERROR代码,如果opts无法解析,则如果密钥/值对不能被解析,则由av_opt_set()发出的错误代码。


int  av_opt_set_from_string (void *ctx, const char *opts, const char *const *shorthand, const char *key_val_sep, const char *pairs_sep)
解析opts中的键值对列表。

对于找到的每个键=值对,设置ctx中相应选项的值。

参数:ctx:AVClass对象设置选项

   opts:选项字符串,由分隔符分隔的键值对

   shorthand:一个以NULL结尾的快捷方式符号选项名称数组:如果opts中的第一个字段没有关键部分,则该关键字取自速记的第一个元素; 然后再次为第二个等等,直到选择完成,缩写完成或找到命名选项; 之后,所有选项都必须命名

   key_val_sep:用于将值与值分隔的0个终止的字符列表,例如'='

   pairs_sep:用于将两个对彼此分离的0个字符的列表,例如':'或','

返回:成功设置key = value对的数量,或与错误时的AVERROR代码相对应的负数值:AVERROR(EINVAL)如果opts无法解析,则如果键/值对不能被解析,则由av_set_string3()发出的错误代码。


void  av_opt_free (void *obj)
释放obj中所有分配的对象。


int  av_opt_flag_is_set (void *obj, const char *field_name, const char *flag_name)
检查flags字段中是否设置了特定的标志。

参数:field_name:标志字段选项的名称

   flag_name:要检查的标志的名称

返回:如果标志设置为非零,如果标志未设置,则为0,不是正确的类型,或者标志字段不存在。


int  av_opt_set_dict (void *obj, struct AVDictionary **options)
设置对象上给定字典的所有选项。

参数:obj:一个结构体,其第一个元素是指向AVClass的指针

   options:选择处理。 这个字典将被释放,并被一个新的字体替换,其中包含obj中没有找到的所有选项。 当然这个新的字典需要被av_dict_free()的调用者释放。

返回:0成功,如果在obj中发现某个选项,则为AVIDOR,但无法设置。


int  av_opt_set_dict2 (void *obj, struct AVDictionary **options, int search_flags)
设置对象上给定字典的所有选项。

参数:obj:一个结构体,其第一个元素是指向AVClass的指针

   options:选择处理。 这个字典将被释放,并被一个新的字体替换,其中包含obj中没有找到的所有选项。 当然这个新的字典需要被av_dict_free()的调用者释放。

   search_flags:AV_OPT_SEARCH_ *的组合。

返回:0成功,如果在obj中发现某个选项,则为AVIDOR,但无法设置。


int  av_opt_get_key_value (const char **ropts, const char *key_val_sep, const char *pairs_sep, unsigned flags, char **rkey, char **rval)
从字符串的开头提取键值对。

参数:ropts:指向选项字符串的指针,将被更新为指向其余的字符串(对之一或最后一个NUL)

   key_val_sep:用于将值与值分隔的0个终止的字符列表,例如'='

   pairs_sep:用于将两个对彼此分离的0个字符的列表,例如':'或','

   flags:标志; 请参阅下面的AV_OPT_FLAG_ *值

   rkey:解密键,必须使用av_free()

   rval:解析值,必须使用av_free()

返回:> = 0表示成功,否则为错误对应于错误代码的负值; 特别是:AVERROR(EINVAL)如果没有键存在


const AVOption *  av_opt_find (void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
在对象中查找一个选项。

只考虑设置了所有指定标志的选项。

参数:obj:指向结构体的指针,其第一个元素是指向AVClass的指针。 或者,如果设置了AV_OPT_SEARCH_FAKE_OBJ搜索标志,则指向AVClass的双指针。

   name:要查找的选项的名称。

   uint:当搜索命名常量时,它所属的单位的名称。

   opt_flags:仅查找所有指定的标志设置的选项(AV_OPT_FLAG)。

   search_flags:AV_OPT_SEARCH_ *的组合。

返回:指向找到的选项的指针,如果没有找到选项,则返回NULL。

注意:使用AV_OPT_SEARCH_CHILDREN标志找到的选项可能无法通过av_opt_set()直接设置。 使用AVDictionary(例如avformat_open_input())选项的特殊调用来设置使用此标志找到的选项。


const AVOption *  av_opt_find2 (void *obj, const char *name, const char *unit, int opt_flags, int search_flags, void **target_obj)
在对象中查找一个选项。

只考虑设置了所有指定标志的选项。

参数:obj:指向结构体的指针,其第一个元素是指向AVClass的指针。 或者,如果设置了AV_OPT_SEARCH_FAKE_OBJ搜索标志,则指向AVClass的双指针。

   name:要查找的选项的名称。

   uint:当搜索命名常量时,它所属的单位的名称。

   opt_flags:仅查找所有指定的标志设置的选项(AV_OPT_FLAG)。

   search_flags:AV_OPT_SEARCH_ *的组合。

   target_obj:如果非NULL,则该选项所属的对象将在此处写入。 如果AV_OPT_SEARCH_CHILDREN存在于search_flags中,它可能与obj不同。 如果search_flags包含AV_OPT_SEARCH_FAKE_OBJ,则忽略此参数。

返回:指向找到的选项的指针,如果没有找到选项,则返回NULL。


const AVOption *  av_opt_next (const void *obj, const AVOption *prev)
迭代所有属于obj的AVOptions。

参数:obj:一个AVOptions启用的结构体或一个描述它的AVClass的双指针。

   prev:先前调用此对象上的av_opt_next()的结果或NULL

返回:下一个AVOption或NULL


void *  av_opt_child_next (void *obj, void *prev)
迭代支持obo的启用AVOptions的子对象。

参数:prev:以前调用此函数或NULL的结果

返回:下一个启用AVOptions的子项或NULL


const AVClass *  av_opt_child_class_next (const AVClass *parent, const AVClass *prev)
迭代潜在的启用AVOptions的父母子女。

参数:prev:以前调用此函数或NULL的结果

返回:AVClass对应于下一个潜在的小孩或NULL


void *  av_opt_ptr (const AVClass *avclass, void *obj, const char *name)
获取一个指向struct中请求的字段的指针。

这个函数允许访问一个结构体,即使它的字段被移动或重新命名,因为进行访问的应用程序已被编译,

返回:一个指向该字段的指针,可以将其转换为正确的类型并读取或写入。


void  av_opt_freep_ranges (AVOptionRanges **ranges)
释放一个AVOptionRanges结构并将其设置为NULL。


int  av_opt_query_ranges (AVOptionRanges **, void *obj, const char *key, int flags)
获取给定选项的允许范围列表。

返回的列表可能取决于obj中的其他字段,例如配置文件。

参数:flags:是一个位掩码的标志,未定义的标志不应该被设置,应该被忽略AV_OPT_SEARCH_FAKE_OBJ表示obj是一个双指针到AVClass而不是一个完整的实例AV_OPT_MULTI_COMPONENT_RANGE表示该函数可能返回多个组件,结果必须使用av_opt_freep_ranges来释放。

返回:成功返回的数量,否则为否定错误代码


int  av_opt_copy (void *dest, const void *src)
将选项从src对象复制到dest对象中。

需要内存分配的选项(例如字符串或二进制)在目标对象中被错误地配置。 分配给这些选项的原始内存将被释放,除非src和dest选项都指向同一个内存。

参数:dest:要复制的对象

   src:复制的对象

返回:0成功,否定错误


int  av_opt_query_ranges_default (AVOptionRanges **, void *obj, const char *key, int flags)
获取给定选项的允许范围的默认列表。

此列表是在不使用AVClass.query_ranges()回调的情况下构建的,可用作回调中的回退。

参数:flags:是一个位掩码的标志,未定义的标志不应该被设置,应该被忽略AV_OPT_SEARCH_FAKE_OBJ表示obj是一个双指针到AVClass而不是一个完整的实例AV_OPT_MULTI_COMPONENT_RANGE表示该函数可能返回多个组件,结果必须使用av_opt_free_ranges来释放。

返回:成功返回的数量,否则为否定错误代码


int  av_opt_is_set_to_default (void *obj, const AVOption *o)
检查给定选项是否设置为其默认值。

选项o必须属于对象。 不能调用此函数来检查子项的选项状态。

参数:obj:AVClass对象检查选项

   o:被检查的选项

返回:> 0,当选项设置为默认值时,0选项未设置为默认值时,错误为<0


int  av_opt_is_set_to_default_by_name (void *obj, const char *name, int search_flags)
检查给定选项是否设置为其默认值。

参数:obj:AVClass对象检查选项

   name:选项名称

   search_flags:组合AV_OPT_SEARCH_ *

返回:> 0,当选项设置为默认值时,0选项未设置为默认值时,错误为<0


int  av_opt_serialize (void *obj, int opt_flags, int flags, char **buffer, const char key_val_sep, const char pairs_sep)
序列化对象的选项。

创建一个包含对象的序列化选项的字符串。 这样的字符串可以传回给av_opt_set_from_string(),以恢复选项值。 序列化值或名称字符串中出现的键/值或对分隔符通过av_escape()函数进行转义。

参数:obj:AVClass对象进行序列化

   opt_flags;将所有指定的标志设置为序列化选项(AV_OPT_FLAG)

   flags:组合AV_OPT_SERIALIZE_ *标志

   buffer:指向缓冲区的指针将分配给包含序列化选项的字符串。 当不再需要时,调用者必须释放缓冲区。

   key_val_sep:用于将键与值分离的字符

   pairs_sep:用于将两个对彼此分开的字符

返回:> = 0成功,否定错误

ffmpeg源码简析(十一)libavformat,libavcodec,libavutil libavformatavformat.h 文件 定义识别文件格式和媒体类型库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相 对全局有效allformat.c 文件 简单的注册/初始化函数,把相应的协议,文件格式,解码器等用相应的链表串起来便于查找。cutils.c 文件 文件格式分析模块使用的两个工具类函数,都是对字符串的操作。file.c 把 file 当做类似 阅读详情

相关推荐

多媒体编解码学习: ffmpeg(更新ffmpeg库使用方法)

文中内容部分参考大牛博客进行边操作边总结 一、ubuntu安装ffmpeg 1. 从ffmpeg官网:https://www.ffmpeg.org/download.html下载源代码,ffmpeg-3.1.2.tar.bz2 2. 解压文件   3. 安装步骤 进入解压目录:   配置makefile:   其中--enable-share生产动态链接库,编程

jayson_jang的专栏 5136

ffmpeg学习日记502-源码-ffmpeg_parse_options()函数分析

源码分析一分析到了parse_loglevel(),继续往下,接下来代码如下: //argv[1]中包含”-d”,则进入if逻辑,回调log_callback_null函数内容是空的,ffmpeg的指令中也没有单独找到”-d”的选项,都是与”n”结合的,所以,这里的代码是什么意思,没有想明白 if(argc>1 && !strcmp(argv[1], "-d")){ run_as_daemon=1; av_log_set_callback(log_cal

WenCoo的博客 1722

ffmpeg自学路(三)ffmpeg各项库说明,及build.sh的shell相关命令说明

一,ffmpeg各项库对应的功能说明

u014436704的专栏 981

FFmpeg学习(三)-- libavutil 代码组成

FFmpeg libavutil

云梦居 3714

FFmpeg入门详解之58:Libavutil详解:理论与实战

libavutil是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。从FFmpeg官网的文档-libavutil来看,avutil主要有一下几种功能:数学函数字符串操作内存管理相关数据结构相关错误码及错误处理日志输出其他辅助信息,比如密钥、哈希值、宏、库版本、常量等AVLogParseUtil。

福优学苑@音视频+流媒体 1145

FFmpeg libavutil 深度剖析:万物之基

libavutil 是 FFmpeg 的零依赖基础设施层,所有上层库均依赖于它。本文深度剖析其内存管理、引用计数、媒体数据模型、选项系统、数学工具等核心子系统,所有代码引用均附文件路径与行号。

Chars 223

Libavutil详解:理论与实战

libavutil 是一个实用库,用于辅助多媒体编程,本文记录 libavutil 库学习及 demo 例程展示。libavutil 是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec 和 libavformat 并不依赖此库。数学函数字符串操作内存管理相关数据结构相关错误码及错误处理日志输出其他辅助信息,比如密钥、哈希值、宏、库版本、常量等AVLog。

明天你好的博客 2173

Libavutil 7.0 文档

libavutil 库是一个便携式多媒体编程的实用工具库。它包含安全的可移植字符串函数、随机数生成器、数据结构、额外的数学函数、密码学和多媒体相关功能(如像素和采样格式的枚举)。它不是一个同时被 libavcodec 和 libavformat 所需的代码库。有关作者的详细信息,请参阅项目的 Git 历史记录 (https://git.ffmpeg.org/ffmpeg),例如在 FFmpeg 源代码目录中键入。命令,或在 https://git.ffmpeg.org/ffmpeg 浏览在线存储库。

宋志辉的博客 227

FFmpeg中libavutil库简介及测试代码

libavutil是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。 以下是测试代码,包括base64, aes, des, hash, log, md5, sha, sha512, tea, twofish, xteaa。 funse...

网络资源是无限的 4475

UE5.6使用ndisplay,单窗口多画面(单机部署),配置、打包流程,无需switchboard

摘要:本文介绍了在UE5.6中使用ndisplay插件的完整流程。首先需要开启ndisplay和launch插件,创建ndisplay配置文件并设置本地单窗口多画面模式。随后通过Process Explorer获取启动命令用于制作bat文件。打包项目时需删除场景中的ndisplay文件,但保留内容浏览器中的配置,并设置为开发版打包。最后将ndisplay文件导出为.ndisplay格式,与bat文件一起放置在打包目录下,通过bat启动程序。注意修改路径和窗口大小时需保持纯英文路径,且bat代码需保持单行格式

weixin_43912248的博客 977

超详细流式细胞术全流程解析:从样本制备到结果分析全攻略

流式细胞术(Flow Cytometry)是现代生物学和医学研究中不可或缺的高通量分析技术,可实现对细胞表型、功能状态、细胞周期等多维度参数的快速检测。本文将从实验全流程出发,详解样本制备、上机操作、参数设置及结果处理的核心要点,帮助科研人员精准掌握流式实验关键技术。

good_rrrrr的博客 3868

FFmpeg 头文件完美翻译之 libavutil 模块

众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。

Leon_Chenl的博客 965

Unity中5分钟实现3D高斯泼溅渲染:从原理到实战部署

3D高斯泼溅(3D Gaussian Splatting)是一种新兴的神经渲染技术,它通过显式地使用大量3D高斯椭球来表示场景,革新了传统的体渲染和神经辐射场(NeRF)方法。其核心原理是将这些3D高斯投影到2D屏幕并进行快速光栅化与Alpha混合,从而绕过了耗时的光线步进,实现了极高的渲染效率。这项技术的价值在于,它能够在消费级GPU上达到实时甚至超实时的帧率,同时保持紧凑的数据表达和惊人的视觉细节,极大地降低了高质量3D重建与渲染的门槛。在应用场景上,它正快速渗透到数字孪生、虚拟现实、文化遗产数字化以及

weixin_29474431的博客 274

ffmpeg获取时间方法(libavutil/time.c)

FFmpeg libavutil/time.c int64_t av_gettime_relative(void) { #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC) /* 如果有clock_gettime函数 和定义了CLOCK_MONOTONIC(从系统重启到现在所经过的时间) 就通过clock_gettime该函数...

mwsubt的博客 2969

海洋与地质地理信息数据下载网站汇总集锦

各种海洋与地质地理信息数据集合

qq_36980284的博客 1268

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 198

ffmpeg常用函数和数据结构

记录下ffmpeg常用的一些函数和数据结构环境:ffmpeg-6.1。

langzi113的专栏 1652

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 417

FFmpeg libavutil主要功能概述

0 引言 FFmpeg使用很久了,一直没有认真看过FFmpeg内部源码所提供的各种机制和功能。本文的主要目标是能够初步总结FFmpeg的avutil中所提供的功能。从FFmpeg官网的文档-libavutil来看,avutil主要有一下几种功能(顺序做了重排): 数学函数 字符串操作 内存管理相关 数据结构相关 错误码及错误处理 日志输出 其他辅助信息,比如密钥、哈希值、宏、库版本、常量等 ...

SurpassLi的专栏 78

CD-SSB和NCD-SSB相关内容

NR中,PSS/SSS 和PBCH总是绑定的,因此也称为SSB block。频域由下往上,第121个SC(k = 120)的中心频率,就是SSB的GSCN对应的SSREF(同步参考频率)的出处如上,同步栅格映射到SSB 的RE位置是10个PRB的位置,然后指向RE index 0,即第121个子载波的中心频率;UE获得N_offset_GSCN后,即可结合当前SSB的GSCN推算下一个SSB的GSCN =N_Reference_GSCN(当前SSB的GSCN) + N_offset_GSCN。

asd199086的博客 3431

HQChart实战教程21 - uniapp app端K线图定制tooltip

HQChart实战教程21 - uniapp app端K线图定制tooltip序效果步骤2. 注册标题绘制事件3. 标题绘制回调函数格式说明eventdataobjtooltip显示函数完整代码HQChart代码地址 序 hqchartK线图内置一个tooltip, 如果需要定制一个tooltip, 我们可以通过注册绘制标题事件,来自己做一个div显示数据。 参考教程HQChart实战教程7-自定义显示手势点击K线显示信息 效果 步骤 在外部创建一个view,并在view里创建需要显示的信息字段. 例子里

小银 2561

FFmpeg 学习(一):FFmpeg 简介

它提供了录制、转换以及流化音视频的完整解决方案。如果您之前没有阅读FFmpeg代码的经验,建议优先阅读libavformat、libavcodec以及libavutil下面的代码,它们提供了音视频开发的最基本功能,应用范围也是最广的。链接:https://zhuanlan.zhihu.com/p/568800000。链接:https://zhuanlan.zhihu.com/p/568800000。商业转载请联系作者获得授权,非商业转载请注明出处。商业转载请联系作者获得授权,非商业转载请注明出处。

yinshipin007的博客 3764

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ffmpeg数据结构简介

每个库的功能作用在 FFmpeg 的编译中可以编译出了6个so动态库:libavcodec.so libavfilter.so libavformat.so libavutil.so l...

音视频开发进阶 844

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

解决 symbol lookup error av_opt_child_class_iterate, version LIBAVUTIL_56

经查,是因为我安装了gimp, 它会在 /lib/x86_64-linux-gnu 安装了libavformat, libavcodec, LIBAVUTIL 等库,干扰了ffmpeg 的运行。这个错误是说,LIBAVUTIL_56 这个库中没有av_opt_child_class_iterate 函数声明,因为我的库都在/opt/ffmpeg_build/lib 目录下,用ldd ffmpeg 观察,保证其为正确链接就可以正常运行了!算是解决问题的经验,留存!

hjjdebug的专栏 2365

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python安装ffmpeg包操作方法

步骤1. Anaconada 环境 步骤2. 以下两者方法均失败的情况下用步骤3 pip install FFmpeg conda install FFmpeg 步骤3. 采用镜像方式安装 conda install -c https://conda.anaconda.org/menpo ffmpeg 步骤4. 安装conda-forge conda-forge是编译的f...

5792

ffmpeg常用库、术语、API、数据结构总结

ffmpeg常用库、术语、API、数据结构总结

TrueDei 3664
上一篇: FFMPEG学习【libavutil】:数据结构(二)
下一篇: FFMPEG学习【libavutil】:数据结构(四)
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值