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

来源:互联网 发布:稀疏编码算法 详解 编辑:程序博客网 时间:2024/05/18 02:45

一、AVDictionary

简单键:值存储。

字典用于存储键:值对。 要创建一个AVDictionary,只需将一个NULL指针的地址传递给av_dict_set()。 NULL可以用作空字典,无论何处需要指向AVDictionary的指针。 使用av_dict_get()来检索一个条目或迭代所有条目,最后使用av_dict_free()来释放字典及其所有内容。

AVDictionary *d = NULL;           // "create" an empty dictionaryAVDictionaryEntry *t = NULL;av_dict_set(&d, "foo", "bar", 0); // add an entrychar *k = av_strdup("key");       // if your strings are already allocated,char *v = av_strdup("value");     // you can avoid copying them like thisav_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {    <....>                             // iterate over all entries in d}av_dict_free(&d);



一)、数据结构

struct  AVDictionaryEntry{
char * key;
char * value;
}


二)、宏

#define AV_DICT_MATCH_CASE   1只能获得一个具有完全匹配关键字的条目。


#define AV_DICT_IGNORE_SUFFIX   2返回字典中的第一个条目,其第一部分对应于搜索关键字,忽略找到的关键字串的后缀。


#define AV_DICT_DONT_STRDUP_KEY   4获取已分配给av_malloc()或另一个内存分配函数的密钥的所有权。


#define AV_DICT_DONT_STRDUP_VAL   8获取已经使用av_malloc()或另一个内存分配函数分配的值的所有权。


#define AV_DICT_DONT_OVERWRITE   16不要覆盖现有条目


#define AV_DICT_APPEND   32如果条目已经存在,请附加到该条目。


#define AV_DICT_MULTIKEY   64允许在字典中存储几个相等的键。


三)、函数

AVDictionaryEntry * av_dict_get (const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)获取具有匹配键的字典条目。

返回的条目键或值不能更改,否则将导致未定义的行为。

要遍历所有字典条目,您可以将匹配键设置为空字符串“”,并设置AV_DICT_IGNORE_SUFFIX标志。

参数:prev:设置到先前匹配的元素以找到下一个。 如果设置为NULL,则返回第一个匹配元素。

  key:匹配键

  flags:控制如何检索条目的AV_DICT_ *标志的集合

返回:找到条目或NULL,以防在字典中找不到匹配条目


int av_dict_count (const AVDictionary *m)获取字典中的条目数。

参数:m:字典

返回:字典中的条目数


int av_dict_set (AVDictionary **pm, const char *key, const char *value, int flags)设置* pm中的给定条目,覆盖现有条目。

注意:如果设置了AV_DICT_DONT_STRDUP_KEY或AV_DICT_DONT_STRDUP_VAL,这些参数将被错误地释放。

警告:将新条目添加到字典会使先前使用av_dict_get返回的所有现有条目无效。

参数:pm:指向字典结构体的指针。 如果* pm为NULL,则会分配一个字典结构并放入* pm。

  key:添加到* pm的条目键(将根据标志为av_strduped或添加为新的键)

  value:条目值添加到* pm(将被av_strduped或添加为一个新的密钥取决于标志)。 传递NULL值将导致现有条目被删除。

返回:> = 0,否则为错误代码<0


int av_dict_set_int (AVDictionary **pm, const char *key, int64_t value, int flags)av_dict_set的便利包装器将值转换为字符串并存储。

注意:如果设置了AV_DICT_DONT_STRDUP_KEY,则键将被释放。


int av_dict_parse_string (AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)解析键/值对列表,并将解析的条目添加到字典中。

万一发生故障,所有成功设置的条目存储在* pm中。 您可能需要手动释放创建的字典。

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

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

  flags:添加到字典时要使用的标志。 AV_DICT_DONT_STRDUP_KEY和AV_DICT_DONT_STRDUP_VAL将被忽略,因为键/值令牌将始终被复制。

返回:0成功,否则ERROR代码失败


int av_dict_copy (AVDictionary **dst, const AVDictionary *src, int flags)将条目从一个AVDictionary结构复制到另一个。

参数:dst:指向AVDictionary结构体的指针。 如果* dst为NULL,则此函数将为您分配一个结构,并将其放在* dst中

  src:指向源AVDictionary结构的指针

  flags:在* dst中设置条目时要使用的标志

注意:使用AV_DICT_IGNORE_SUFFIX标志读取元数据

返回:0成功,否则ERROR代码失败。 如果dst由此功能分配,则呼叫者应释放相关联的内存。


void av_dict_free (AVDictionary **m)释放分配给AVDictionary结构体的所有内存以及所有键和值。


int av_dict_get_string (const AVDictionary *m, char **buffer, const char key_val_sep, const char pairs_sep)以字符串形式获取字典条目。

创建一个包含字典条目的字符串。 这样的字符串可以传回给av_dict_parse_string()。

注意:字符串使用反斜杠('\')进行转义。

参数:m:字典

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

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

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

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

警告:分隔符不能既不是“\”也不是“\ 0”。 他们也不一样。



二、AVTree

低复杂度树容器。

插入,移除,找到相等的,最大的,小于和小于大于所有都具有O(log n)最坏情况的复杂性。


一)、函数

struct AVTreeNode * av_tree_node_alloc (void)分配AVTreeNode。


void * av_tree_find (const struct AVTreeNode *root, void *key, int(*cmp)(const void *key, const void *b), void *next[2])找一个元素

参数:root:指向树的根节点的指针

  next:如果next不为NULL,则next [0]将包含上一个元素,next [1]将包含下一个元素。 如果不存在,则下一个对应的条目不变。

  cmp:比较功能用于比较树中的元素,API与标准C的qsort相同。保证第一个也只有第一个参数为cmp()将成为av_tree_find()的关键参数,因此如果用户想要 ,是不同的类型(如不透明的上下文)。

返回:如果树中没有这样的元素,则具有cmp(key,elem)== 0或NULL的元素。

参数:


void * av_tree_insert (struct AVTreeNode **rootp, void *key, int(*cmp)(const void *key, const void *b), struct AVTreeNode **next)插入或移除元素。

如果* next为NULL,则提供的元素将被删除(如果存在)。 如果* next为非NULL,则提供的元素将被插入,除非它已经存在于树中。

参数:rootp:指向树的根节点的指针的指针; 注意根节点在插入过程中可以改变,这是保持树平衡所必需的。

  key:指向要插入树中的元素键的指针

           next:用于分配和释放AVTreeNodes。 对于插入,用户必须将其设置为至少为av_tree_node_size字节大小的已分配和归零的对象。 如果av_tree_insert()已被使用,将会将其设置为NULL。 对于删除元素* next由用户设置为NULL,av_tree_insert()将其设置为用于已删除元素的AVTreeNode。 这允许使用扁平阵列,与许多已发现的元素相比,它们具有较低的开销。 您可能需要定义如下功能:

void *tree_insert(struct AVTreeNode **rootp, void *key,                  int (*cmp)(void *key, const void *b),                  AVTreeNode **next){    if (!*next)        *next = av_mallocz(av_tree_node_size);    return av_tree_insert(rootp, key, cmp, next);}void *tree_remove(struct AVTreeNode **rootp, void *key,                  int (*cmp)(void *key, const void *b, AVTreeNode **next)){    av_freep(next);    return av_tree_insert(rootp, key, cmp, next);

   cmp:比较功能用于比较树中的元素,API与标准C的qsort相同

返回:如果没有插入,发现元素; 如果发生插入或删除,则返回任一键或NULL。 哪一个取决于树状态和实现。 你不应该假设它是代码中的一个或另一个。


void av_tree_destroy (struct AVTreeNode *t)

void av_tree_enumerate (struct AVTreeNode *t, void *opaque, int(*cmp)(void *opaque, void *elem), int(*enu)(void *opaque, void *elem))对给定范围内的树中的所有元素应用enu(opaque,&elem)。

参数:cmp:对于范围以下的元素返回<0的比较函数,范围以上的元素返回> 0,范围内的元素返回== 0

注意:cmp函数应该使用与构造树相同的顺序。


二)、变量

const int av_tree_node_size

原创粉丝点击