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_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
- FFMPEG学习【libavutil】:数据结构(四)
- FFMPEG学习【libavutil】:数据结构(一)
- FFMPEG学习【libavutil】:数据结构(二)
- FFMPEG学习【libavutil】:数据结构(三)
- FFMPEG学习【libavutil】:Crypto and Hashing(四)
- FFMPEG学习【libavutil】:Memory Management(一)
- FFMPEG学习【libavutil】:Memory Management(二)
- FFMPEG学习【libavutil】:音频相关(一)
- FFMPEG学习【libavutil】:音频相关(二)
- FFMPEG学习【libavutil】:音频相关(三)
- FFMPEG学习【libavutil】:Mathematics
- FFMPEG学习【libavutil】:Mathematics:AVRational
- FFMPEG学习【libavutil】:String Manipulation
- FFMPEG学习【libavutil】:视频相关
- FFMPEG学习【libavutil】:Crypto and Hashing(一)
- FFMPEG学习【libavutil】:Crypto and Hashing(二)
- FFMPEG学习【libavutil】:Crypto and Hashing(三)
- FFMPEG学习【libavutil】:Crypto and Hashing(五)
- win7下无新建文件夹
- Angular(4)
- 错排
- ****HDU
- 异常:org.hibernate.hql.ast.QuerySyntaxException: EmpModel is not mapped [from EmpModel where name = ?
- FFMPEG学习【libavutil】:数据结构(四)
- 杭电problem1004- Let the Balloon Rise
- 只为成功找方法,不为失败找借口! javaweb学习总结(六)——Servlet开发(二)
- python抽象
- Install MySQL 5.7/8.0 on Fedora 26/25, CentOS/RHEL 7.3/6.9
- python学习(三)
- (2)初识看板
- 装饰者模式
- python构造方法