FFmpeg:浅谈 AVBuffer 和 AVBufferRef 结构体

本文详细介绍了FFmpeg中structAVBuffer和structAVBufferRef的结构及其在内存管理中的引用计数功能。通过av_buffer_alloc、av_buffer_create、av_buffer_ref和av_buffer_unref等函数,实现对内存的高效管理和引用跟踪。同时,av_buffer_is_writable和av_buffer_make_writable则用于判断和调整缓冲区的可写性。这些机制确保了FFmpeg在处理音视频数据时的内存安全和性能。

FFmpeg 借助 struct AVBufferstruct AVBufferRef 以及相关 API 实现了引用计数功能。

结构体定义

struct AVBuffer 目前共包含七个成员变量,从功能上可以划分为三部分:

  • 数据部分
    • uint8_t *datasize_t size:指向一段长度为 size 的内存。
    • void *opaque:一个指针,指向一个用户自定义类型的对象,也可为空,FFmpeg 不关心。
    • void (*free)(void *opaque, uint8_t *data):函数指针,用于释放 dataopaque
  • 计数部分:
    • atomic_uint refcount:引用计数,配合 AVBufferRef 使用,记录有多少个 AVBufferRef 对象引用了自己。
  • 辅助部分:
    • int flagsint flags_internal:一些用于描述自身状态的标志变量。

完整定义如下:

struct AVBuffer {
   
   
    uint8_t *data; /**< data described by this buffer */
    size_t size; /**< size of data in bytes */

    /**
     *  number of existing AVBufferRef instances referring to this buffer
     */
    atomic_uint refcount;

    /**
     * a callback for freeing the data
     */
    void (*free)(void *opaque, uint8_t *data);

    /**
     * an opaque pointer, to be used by the freeing callback
     */
    void *opaque;

    /**
     * A combination of AV_BUFFER_FLAG_*
     */
    int flags;

    /**
     * A combination of BUFFER_FLAG_*
     */
    int flags_internal;
};

struct AVBufferRef 更为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值