ffmpeg源码简析(三)av_malloc(),AVIOContext,AVFrame,avio_open2()等
来源:互联网 发布:淘宝店铺上传图片尺寸 编辑:程序博客网 时间:2024/06/01 10:49
内存操作的常见函数位于libavutil\mem.c
av_malloc()
av_malloc()是FFmpeg中最常见的内存分配函数。
av_malloc()的代码可以简化成如下形式。
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(),并做了一些错误检查工作。
关于size_t
size _t 这个类型在FFmpeg中多次出现,简单解释一下其作用。size _t是为了增强程序的可移植性而定义的。不同系统上,定义size_t可能不一样。它实际上就是unsigned int。
av_realloc()
av_realloc()用于对申请的内存的大小进行调整。
void *av_realloc(void *ptr, size_t size) { #if CONFIG_MEMALIGN_HACK int diff; #endif /* let's disallow possibly ambiguous cases */ if (size > (max_alloc_size - 32)) return NULL; #if CONFIG_MEMALIGN_HACK //FIXME this isn't aligned correctly, though it probably isn't needed if (!ptr) return av_malloc(size); diff = ((char *)ptr)[-1]; av_assert0(diff>0 && diff<=ALIGN); ptr = realloc((char *)ptr - diff, size + diff); if (ptr) ptr = (char *)ptr + diff; return ptr; #elif HAVE_ALIGNED_MALLOC return _aligned_realloc(ptr, size + !size, ALIGN); #else return realloc(ptr, size + !size); #endif }
默认情况下(CONFIG_MEMALIGN_HACK这些宏使用默认值0)的代码:
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_malloc()+zeromemory。代码如下。
void *av_mallocz(size_t size) { void *ptr = av_malloc(size); if (ptr) memset(ptr, 0, size); return ptr; }
av_mallocz()中调用了av_malloc()之后,又调用memset()将分配的内存设置为0。
av_calloc()
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()
av_free()用于释放申请的内存。它的定义如下。
void av_free(void *ptr) { #if CONFIG_MEMALIGN_HACK if (ptr) { int v= ((char *)ptr)[-1]; av_assert0(v>0 && v<=ALIGN); free((char *)ptr - v); } #elif HAVE_ALIGNED_MALLOC _aligned_free(ptr); #else free(ptr); #endif }
默认情况下(CONFIG_MEMALIGN_HACK这些宏使用默认值0)的代码:
void av_free(void *ptr) { free(ptr); }
可以看出av_free()简单的封装了free()。
av_freep()
av_freep()简单封装了av_free()。并且在释放内存之后将目标指针设置为NULL。
void av_freep(void *arg) { void **ptr = (void **)arg; av_free(*ptr); *ptr = NULL; }
FFmpeg常见结构体的初始化和销毁函数
AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等)。AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。AVStream,AVCodecContext:视音频流对应的结构体,用于视音频编解码。AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)
avio_open2() (libavformat\aviobuf.c)
int avio_open2(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options);
avio_open2()函数参数的含义如下:
s:函数调用成功之后创建的AVIOContext结构体。url:输入输出协议的地址(文件也是一种“广义”的协议,对于文件来说就是文件的路径)。flags:打开地址的方式。可以选择只读,只写,或者读写。取值如下。 AVIO_FLAG_READ:只读。 AVIO_FLAG_WRITE:只写。 AVIO_FLAG_READ_WRITE:读写。int_cb:目前还没有用过。options:目前还没有用过
avio_open2()的源代码,位于libavformat\aviobuf.c文件中
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options) { URLContext *h; int err; err = ffurl_open(&h, filename, flags, int_cb, options); if (err < 0) return err; err = ffio_fdopen(s, h); if (err < 0) { ffurl_close(h); return err; } return 0; }
从avio_open2()的源代码可以看出,它主要调用了2个函数:ffurl_open()和ffio_fdopen()。其中ffurl_open()用于初始化URLContext,ffio_fdopen()用于根据URLContext初始化AVIOContext。URLContext中包含的URLProtocol完成了具体的协议读写等工作。AVIOContext则是在URLContext的读写函数外面加上了一层“包装”(通过retry_transfer_wrapper()函数)。
- ffmpeg源码简析(三)av_malloc(),AVIOContext,AVFrame,avio_open2()等
- avio_open2初始化AVIOContext
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- FFmpeg函数简单分析:内存的分配和释放(av_malloc()、av_free()等)
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- FFmpeg:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)——雷神神文
- FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
- ffmpeg(3) AVIOContext
- ffmpeg(8) AVIOContext II
- ffmpeg(8) AVIOContext II
- ffmpeg(3) AVIOContext
- ffmpeg之AVIOContext
- FFmpeg源代码简单分析:avio_open2()
- FFmpeg源代码简单分析:avio_open2()
- XDOJ-1163- Simple Problem A(分解质因数)
- ospf学习
- MakeFile示例
- 发送中英文短信
- Java关于this和super的小知识
- ffmpeg源码简析(三)av_malloc(),AVIOContext,AVFrame,avio_open2()等
- [JZOJ5084]子串
- JSP(1)jsp简介、文件结构、加载过程、常用内置对象(out request Response等)
- 最大似然估计 (MLE) 最大后验概率(MAP)
- LeetCode (18)4Sum
- Android进阶之路
- Jboss配置文件内容
- 3ds max动画制作两种方式及操作建议
- linux更改文件或目录的属主和属组