av_register_all
该函数在所有基于FFmpeg
的应用程序中几乎都是第一个被调用的
这个函数把全局的解码器,编码器等结构体注册到一些全局的对象表里,以便后面跑表调用
注册的类型:复用器,解复用器,编码器,解码器,包解析器,BitStreamFilter(位流处理器)等
av_register_all
调用了avcodec_register_all
,avcodec_register_all
注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。av_register_all除了调用
avcodec_register_all之外,还注册了复用器,解复用器,协议处理器
下面附上复用器,解复用器,协议处理器的代码
- 注册复用器的函数是
av_register_output_format
- 注册解复用器的函数是
av_register_input_format
- 注册协议处理器的函数是
ffurl_register_protocol
avcodec_register_all()
avcodec_register_all
注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。
- 硬件加速器注册函数:
av_register_hwaccel()
- 编码器注册函数:
avcodec_register()
- parser注册函数:
av_register_parser()
- Bitstream Filter注册函数:
av_register_bitstream_filter()
内存的分配和释放
内存操作的几个常见函数位于 libavutil\mem.c
先说下size_t
,这个类型在FFmpeg
中多次出现,它的作用其实就是为了增强程序的可移植性而定义的,不同系统上,定义size_t
可能不一样,它实际上就是unsigned int
为什么要内存对齐:内存对齐是什么就不说了,c语言的,很多也有点忘记了,直接看结论吧:内存不对齐对cpu对性能是有影响的
-
av_malloc()
源码也自己去看,除去源码中一大推宏类似于CONFIG_MEMORY_POISONING
,因为这个宏默认都是为0的,源码函数可精简为
void *av_malloc(size_t size)
{
void *ptr = NULL;
/* let's disallow possibly ambiguous cases */
if (size > (max_alloc_size - 32))
return NULL;
ptr = malloc(size);
if(!ptr && !size) {
size = 1;
ptr= av_malloc(1);
}
return ptr;
所以可以看出来,av_malloc()
只是封装了系统的malloc()
,并且做了一些错误检查的工作
-
av_realloc
用于对申请的内存的大小进行调整
跟av_malloc()
一样,除去没用的宏,精简为
void *av_realloc(void *ptr, size_t size)
{
/* let's disallow possibly ambiguous cases */
if (size > (max_alloc_size - 32))
return NULL;
return realloc(ptr, size + !size);
}
可以看出来,av_realloc()
其实就是封装系统的realloc()
-
av_mallocz()
av_mallocz()
可以理解为av_mallocz()
+zeromemory
精简后
void *av_mallocz(size_t size)
{
void *ptr = av_malloc(size);
if (ptr)
memset(ptr, 0, size);
return ptr;
}
可以看出来就是调用了av_malloc(size)
之后,又调用memset()
将分配的内存设置为0
-
av_calloc()
它是简单的封装了av_mallocz()
void *av_calloc(size_t nmemb, size_t size)
{
if (size <= 0 || nmemb >= INT_MAX / size)
return NULL;
return av_mallocz(nmemb * size);
}
从代码中可以看出,它调用av_mallocz()
分配了nmemb * size个字节的内存
-
av_free()
用于释放申请的内存,除去没用的宏之外,代码如下
void av_free(void *ptr)
{
free(ptr);
}
就是封装了free()
-
av_freep()
简单了封装了av_free()
,并且在释放内存之后将目标指针设置为NULL
void av_freep(void *arg)
{
void **ptr = (void **)arg;
av_free(*ptr);
*ptr = NULL;
}
网友评论