ffmpeg av_buffer_unref的逻辑实现; av_freep 和 av_freep函数的区别

av_buffer_unref 是 FFmpeg 中用于管理引用计数和内存释放的核心函数,其内部实现机制如下:

一、核心流程

  1. 引用计数递减
    函数首先对 AVBufferRef 的 buffer->refcount 进行原子递减操作(通过 atomic_fetch_add_explicit 等机制保证线程安全)。

  2. 引用计数检查

    • 若递减后 refcount > 0:仅释放当前 AVBufferRef 结构体,保留底层 AVBuffer 和数据内存。
    • 若递减后 refcount == 0:触发内存释放流程(包括 AVBuffer 自身及其数据)。
  3. 内存释放逻辑

    • 调用 buffer->free 回调函数(如默认的 av_buffer_default_free 或用户自定义的释放函数),释放 buffer->data 指向的数据内存。
    • 若 AVBuffer 属于内存池(AVBufferPool),则通过 buffer_pool_release_buffer 将内存块返回池中以供复用。
  4. 资源清理

    • 置空 AVBufferRef->buffer 指针,避免悬垂引用。
    • 释放 AVBufferRef 结构体本身的内存。

二、关键设计细节

  1. 线程安全
    引用计数的增减操作通过原子指令实现,确保多线程环境下数据一致性26。

  2. 内存池优化
    若 AVBuffer 来自内存池,释放时不会立即归还给系统,而是通过链表管理复用,减少频繁内存分配开销。

  3. 回调扩展性
    buffer->free 允许注册自定义释放逻辑(如 GPU 内存释放需调用特定驱动 API),支持异构硬件资源管理。


三、代码逻辑简化示例

 
void av_buffer_unref(AVBufferRef **ref) {if (!*ref)return;AVBuffer *buf = (*ref)->buffer;// 原子操作减少引用计数int refcount = atomic_fetch_sub_explicit(&buf->refcount, 1, memory_order_acq_rel);if (refcount == 1) { // 引用归零if (buf->free)   // 调用释放回调buf->free(buf->opaque, buf->data);if (buf->pool)   // 内存池回收逻辑buffer_pool_release_buffer(buf->pool, buf);av_free(buf);    // 释放AVBuffer结构体}av_freep(ref);       // 释放AVBufferRef并置空指针
}

四、关联机制

  1. 与 av_buffer_ref 的关系
    av_buffer_ref 增加引用计数并复制 AVBufferRef,而 av_buffer_unref 负责递减计数和释放,两者共同维护引用生命周期。

  2. 与 AVPacket/AVFrame 的交互
    当 AVPacket 或 AVFrame 调用 av_packet_unref 或 av_frame_unref 时,内部最终通过 av_buffer_unref 释放底层数据内存。


通过上述机制,av_buffer_unref 实现了高效且安全的内存管理,成为 FFmpeg 多模块资源共享和生命周期控制的基础。

av_freep  和 av_freep函数的区别

  1. av_free(void * p)

    • 参数类型‌:接受 void * 类型的指针13。
    • 作用‌:仅释放指针指向的内存块,‌不修改指针本身的值‌,释放后指针仍指向原地址(即悬垂指针)

                

uint8_t *data = av_malloc(100); 
av_free(data); // 释放内存,但 data 仍指向已释放的地址

  1. av_freep(void ** p)

    • 参数类型‌:接受 void ** 类型的指针地址12。
    • 作用‌:
      1. 释放指针指向的内存块;
      2. 将原指针置为 NULL‌,避免悬垂指针问题12。
       
      uint8_t *data = av_malloc(100); 
      av_freep(&data); // 释放内存,并将 data 置为 NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 GPS 数据中捕捉城市休闲热点:空间异质性视角下的新框架

从 GPS 数据中捕捉城市休闲热点:空间异质性视角下的新框架 原文:Capturing urban recreational hotspots from GPS data: A new framework in the lens of spatial heterogeneity 1. 背景与意义 城市娱乐活动的重要性: 娱乐活动是城市生活…

rk3568main.cc解析

rk3568main.cc解析 前言解析前言 正点原子rk3568学习,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 从执行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk356x\…

【实验数据处理matlab程序】程序1:绘制figure文件中曲线的RMS值

立意 在本课题所涉及的实验中,需要将2个拉线式位移传感器中的数据收集并处理,在此基础上求解相应的速度 主要功能 针对一个figure文件中仅包含一个plot,且该plot中包含指定数目的曲线,求这些曲线的RMS值;针对一个fi…

kotlin的kmp编程中遇到Unresolved reference ‘java‘问题

解决办法 打开 File → Project Structure → Project 确保 Project SDK 是 与你的 jvmToolchain 保持一致 如果没有,点击右上角 Add SDK 添加 JDK 路径 同步Sync 然后就正常了。 package org.example.projectimport androidx.compose.animation.AnimatedVi…

静电放电测试中垂直和水平耦合板的作用

在静电放电(ESD,Electrostatic Discharge)测试中,垂直耦合板(Vertical Coupling Plane, VCP)和水平耦合板(Horizontal Coupling Plane, HCP)是模拟设备在实际环境中因静电放电产生的…

Web开发-JavaEE应用JNDI注入RMI服务LDAP服务DNS服务高版本限制绕过

知识点: 1、安全开发-JavaEE-JNDI注入-LADP&RMI&DNS等 2、安全开发-JavaEE-JNDI注入-项目工具&手工原理等 演示案例-WEB开发-JavaEE-JNDI注入&LDAP&RMI服务&DNS服务&高版本限制绕过 JNDI全称为 Java Naming and DirectoryInterface&am…

基于Transformer与随机森林的多变量时间序列预测

哈喽,我不是小upper,今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。 不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂!Transformer !!https://blog.csdn.net/qq_70350287/article/detail…

初识网络原理

文章目录 1.IP地址2.端口号3.网络中的五元组4.协议分层5.封装和分用6.客户端与服务器 1.IP地址 IP地址 (IP Address): 用于在网络中唯一标识一台设备(主机、路由器等)。IP地址分为IPv4和IPv6两种版本。IPv4是32位地址,通常表示为四个用点分隔…

健康养生之道

健康养生是一种积极的生活态度,是对自己和家人的关爱。从生活的细微之处做起,便能为健康打下坚实的基础。 在生活习惯方面,要注重细节。保持居住环境的整洁与通风,让生活空间舒适宜人。勤洗手、勤换洗衣物,养成良好的卫…

几种电气绝缘类型

1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…

01.浏览器自动化webdriver源码分析之启动函数

日后,网络爬虫也好,数据采集也好,自动化必然是主流。因此,笔者未雨绸缪,在此研究各类自动化源码,希望能够赶上时代,做出一套实用的自动化框架。 这里先研究传统的webdriver中转来进行浏览器自动…

PLOG安装

Plog可以通过以下命令安装 cd ~ && git clone https://github.com/SergiusTheBest/plog.gitcd plog && mkdir buildcd build && cmake ..make && sudo make installcd ~ && sudo rm -rf ./plog若无法科学上网,可使用git cl…

Cyber SpaceGuidance网安学习指南见解

免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:这里可以添加本文要记录的大概内容: 提示:以…

第十五届蓝桥杯 2024 C/C++组 下一次相遇

目录 题目: 题目描述: 题目链接: 思路: 自己的思路详解: 更好的思路详解: 代码: 自己的思路代码详解: 更好的思路代码详解: 题目: 题目描述&#xf…

Vue3中provide和inject数据修改规则

在 Vue3 中,通过 inject 接收到的数据是否可以直接修改,取决于 provide 提供的值的类型和响应式处理方式: 1. 若提供的是普通值(非响应式数据) javascript 复制 // 父组件 provide(staticValue, 123); 子组件修改行…

今日CSS笔记

原手写笔记 ------------------------------------------------------------------------------------------------------- css选择器的种类有很多种。这里只介绍几种常用的选择器。 1. 标签选择器标签选择器是最基本的选择器,它可以选择所有的标签。例如&#xff…

健康生活新指南

在 “朋克养生” 与 “躺平焦虑” 并存的时代,真正的健康生活无需刻意 “内卷”。这几个简单又实用的养生妙招,能让你在忙碌日常中悄悄升级健康状态,轻松拥抱活力人生。​ 一、饮食:吃对食物,给身体 “加 Buff”​ 别…

轻量级景好鼠标录制器

景好鼠标录制器(详情请戳 官网)是一款免费无广的键鼠动作录制/循环回放工具,轻松自动化应对一些重复繁琐的操作任务,如来回切换窗口、文档同一相对位置的复制粘贴等场景,兼容Win XP - 11 。毕竟此款本身主打简约类型&a…

结构体与共用体-------C语言经典题目(3)

结构体 1.如何定义和使用结构体指针? 1.结构体指针的定义 首先需要定义结构体类型,例如表示学生信息的结构体: struct Student {char name[50];int age;float score; };接着,使用struct 关键字和指针符号* 声明结构体指针&#x…

未来教育风向标 | 教育学顶流985高校,华东师范大学《AIGC技术赋能教育数字化转型的机遇与挑战》,13所大学deepseek

今天大师兄给大家推荐的是华东师范大学祝智庭教授的《AIGC技术赋能教育数字化转型的机遇与挑战》。华东师范大学是一所985学校,在最新的国家学科测评中,软件工程为A级,教育学为A级。 可以说在AI和教育的结合上是国内top级别的存在。 此讲义探…