热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FFmpeg总结(四)AV系列结构体之AVBuffer、AVBufferRef、AVBufferPool

位置:libavutilbuffer.hAVBuffer采用引用计数的数据Buffer的API。有两个核心对象这个API——AVBuffer和AVBufferRef。

位置:libavutil/buffer.h



这里写图片描述



AVBuffer采用引用计数的数据Buffer的API。

有两个核心对象这个API——AVBuffer和AVBufferRef。

AVBuffer代表数据缓冲区本身,它是私有的,不能直接被调用者调用。我们可以通过AVBufferRef,调用者须要检查两个AVBuffer指针是否指向两个不同的引用在同一数据buffer中。AVBufferRef 代表一个单个引用指向AVBuffer,调用者可以直接调它。

有两个功能函数提供创建一个AVBuffer对象在一个单引用中,av_buffer_alloc()分配置一个新buffer空间。av_buffer_create()负责包装已存在数组的AVBuffer对象。从一个已存在引用,其他的引用将创建通过av_buffer_ref()方法。
使用av_buffer_unref(),交释放这个引用(包含数据引用及计数引用)。

在已经存在的AVBuffer引用中,FFmpeg认为AVBuffer是可写入相关数据的。(不会被标识只读),av_buffer_is_writable() 函数提供是否可write的功能,如果不能将自动创建一个新的可写的buffer。

typedef struct AVBuffer AVBuffer;/*** A reference to a data buffer.** The size of this struct is not a part of the public ABI and it is not meant* to be allocated directly.*/
typedef struct AVBufferRef {AVBuffer *buffer;/*** The data buffer. It is considered writable if and only if* this is the only reference to the buffer, in which case* av_buffer_is_writable() returns 1.*/uint8_t *data;/*** Size of data in bytes.*/int size;
} AVBufferRef;/*** Allocate an AVBuffer of the given size using av_malloc().** @return an AVBufferRef of given size or NULL when out of memory*/
AVBufferRef *av_buffer_alloc(int size);/*** Same as av_buffer_alloc(), except the returned buffer will be initialized* to zero.*/
AVBufferRef *av_buffer_allocz(int size);/*** Always treat the buffer as read-only, even when it has only one* reference.*/
#define AV_BUFFER_FLAG_READONLY (1 <<0)/*** Create an AVBuffer from an existing array.** If this function is successful, data is owned by the AVBuffer. The caller may* only access data through the returned AVBufferRef and references derived from* it.* If this function fails, data is left untouched.* &#64;param data data array* &#64;param size size of data in bytes* &#64;param free a callback for freeing this buffer&#39;s data* &#64;param opaque parameter to be got for processing or passed to free* &#64;param flags a combination of AV_BUFFER_FLAG_*** &#64;return an AVBufferRef referring to data on success, NULL on failure.*/
AVBufferRef *av_buffer_create(uint8_t *data, int size,void (*free)(void *opaque, uint8_t *data),void *opaque, int flags);/*** Default free callback, which calls av_free() on the buffer data.* This function is meant to be passed to av_buffer_create(), not called* directly.*/
void av_buffer_default_free(void *opaque, uint8_t *data);/*** Create a new reference to an AVBuffer.** &#64;return a new AVBufferRef referring to the same AVBuffer as buf or NULL on* failure.*/
AVBufferRef *av_buffer_ref(AVBufferRef *buf);/*** Free a given reference and automatically free the buffer if there are no more* references to it.** &#64;param buf the reference to be freed. The pointer is set to NULL on return.*/
void av_buffer_unref(AVBufferRef **buf);/*** &#64;return 1 if the caller may write to the data referred to by buf (which is* true if and only if buf is the only reference to the underlying AVBuffer).* Return 0 otherwise.* A positive answer is valid until av_buffer_ref() is called on buf.*/
int av_buffer_is_writable(const AVBufferRef *buf);/*** &#64;return the opaque parameter set by av_buffer_create.*/
void *av_buffer_get_opaque(const AVBufferRef *buf);int av_buffer_get_ref_count(const AVBufferRef *buf);/*** Create a writable reference from a given buffer reference, avoiding data copy* if possible.** &#64;param buf buffer reference to make writable. On success, buf is either left* untouched, or it is unreferenced and a new writable AVBufferRef is* written in its place. On failure, buf is left untouched.* &#64;return 0 on success, a negative AVERROR on failure.*/
int av_buffer_make_writable(AVBufferRef **buf);/*** Reallocate a given buffer.** &#64;param buf a buffer reference to reallocate. On success, buf will be* unreferenced and a new reference with the required size will be* written in its place. On failure buf will be left untouched. *buf* may be NULL, then a new buffer is allocated.* &#64;param size required new buffer size.* &#64;return 0 on success, a negative AVERROR on failure.** &#64;note the buffer is actually reallocated with av_realloc() only if it was* initially allocated through av_buffer_realloc(NULL) and there is only one* reference to it (i.e. the one passed to this function). In all other cases* a new buffer is allocated and the data is copied.*/
int av_buffer_realloc(AVBufferRef **buf, int size);/*** &#64;}*/typedef struct AVBufferPool AVBufferPool;/*** Allocate and initialize a buffer pool.** &#64;param size size of each buffer in this pool* &#64;param alloc a function that will be used to allocate new buffers when the* pool is empty. May be NULL, then the default allocator will be used* (av_buffer_alloc()).* &#64;return newly created buffer pool on success, NULL on error.*/
AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size));/*** Allocate and initialize a buffer pool with a more complex allocator.** &#64;param size size of each buffer in this pool* &#64;param opaque arbitrary user data used by the allocator* &#64;param alloc a function that will be used to allocate new buffers when the* pool is empty.* &#64;param pool_free a function that will be called immediately before the pool* is freed. I.e. after av_buffer_pool_can_uninit() is called* by the pool and all the frames are returned to the pool and* freed. It is intended to uninitialize the user opaque data.* &#64;return newly created buffer pool on success, NULL on error.*/
AVBufferPool *av_buffer_pool_init2(int size, void *opaque,AVBufferRef* (*alloc)(void *opaque, int size),void (*pool_free)(void *opaque));/*** Mark the pool as being available for freeing. It will actually be freed only* once all the allocated buffers associated with the pool are released. Thus it* is safe to call this function while some of the allocated buffers are still* in use.** &#64;param pool pointer to the pool to be freed. It will be set to NULL.*/
void av_buffer_pool_uninit(AVBufferPool **pool);/*** Allocate a new AVBuffer, reusing an old buffer from the pool when available.* This function may be called simultaneously from multiple threads.** &#64;return a reference to the new buffer on success, NULL on error.*/
AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);/*** &#64;}*/#endif /* AVUTIL_BUFFER_H */

AVBufferPool 是用来管理大buffer时的API

调用者必须使用av_buffer_pool_init()创建一个buffer池&#xff0c;无论什么时候需要&#xff0c;通过av_buffer_pool_get()&#xff0c;得到新buffer的引用&#xff0c;和av_buffer_alloc()非常像&#xff0c;当不被引用时&#xff0c;会重新归还给pool&#xff0c;而不用去像AVBuffer那样释放。当调用者不再分配新的buffer时&#xff0c;av_buffer_pool_uninit() 必须调用&#xff0c;表明这个pool将自动释放了&#xff08;因为这个pool也是一个对象&#xff09;。分配和释放buffer&#xff0c;是线程安全操作&#xff0c;只要保证没有其他默认alloc的callback在使用。这个结构体是私有的&#xff0c;不能直接被外部使用&#xff0c;外部可以用av_buffer_pool_init()&#xff0c;及av_buffer_pool_uninit()函数。


推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
author-avatar
ze602
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有