一、AVDictionary
简单键:值存储。
字典用于存储键:值对。 要创建一个AVDictionary,只需将一个NULL指针的地址传递给av_dict_set()。 NULL可以用作空字典,无论何处需要指向AVDictionary的指针。 使用av_dict_get()来检索一个条目或迭代所有条目,最后使用av_dict_free()来释放字典及其所有内容。
AVDictionary *d = NULL; // "create" an empty dictionary
AVDictionaryEntry *t = NULL;
av_dict_set(&d, "foo", "bar", 0); // add an entry
char *k = av_strdup("key"); // if your strings are already allocated,
char *v = av_strdup("value"); // you can avoid copying them like this
av_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 |
#define | AV_DICT_DONT_STRDUP_VAL 8 |
#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) |
注意:如果设置了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_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) |
参数:dst:指向AVDictionary结构体的指针。 如果* dst为NULL,则此函数将为您分配一个结构,并将其放在* dst中
src:指向源AVDictionary结构的指针
flags:在* dst中设置条目时要使用的标志
注意:使用AV_DICT_IGNORE_SUFFIX标志读取元数据
返回:0成功,否则ERROR代码失败。 如果dst由此功能分配,则呼叫者应释放相关联的内存。
void | av_dict_free (AVDictionary **m) |
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) |
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)) |
参数:cmp:对于范围以下的元素返回<0的比较函数,范围以上的元素返回> 0,范围内的元素返回== 0
注意:cmp函数应该使用与构造树相同的顺序。
二)、变量
const int | av_tree_node_size |