ffmpeg buffer管理

除了内存管理之外,数据的前后级流转也涉及到buffer管理. 个人觉得ffmpeg里面的buffer管理实现极为巧妙,也很值得借鉴.

概述

重要数据结构

AVBufferPool

在libavutil/buffer_internal.h中定义,为内部数据结构,不能在应用程序中直接引用.

  • mutex 用于多线程资源保护
  • pool 指向BufferPoolEntry链表的头,AVBufferPool可以管理所有的BufferPoolEntry.
  • 在初始化AVBufferPool时pool是空,只有在av_buffer_pool_get()时才会判断
  • 和创建.如图av_buffer_pool_get函数流程:

  • refcount AVBufferPool的引用次数,初始化之后为1,av_buffer_pool_get()会+1,
  • pool_release_buffer() av_buffer_pool_uninit()会-1. 为0时会buffer_pool_free
  • 释放pool
  • size 不是指缓存池的个数,而是指AVBuffer.size
  • opaque 用户自定义需要传递给回调函数参数,对应pool_free回调函数的opaque参数
  • allo alloc2 提供两种内存分配方式,1: 注册回调函数 2: av_buffer_alloc
  • pool_free 注册回调函数,av_buffer_pool_init2()注册,用于指定一种更负责的内存分配器。

BufferPoolEntry

在libavutil/buffer_internal.h中定义,为内部数据结构,不能在应用程序中直接引用.

从数据结构中开看到BufferPoolEntry就是一个链表,AVBufferPool中存储了BufferPoolEntry根节点.

  • data opaqu free 以上的BufferPoolEntry的opaque、data、free都是指向了AVBuffer最
  • 开始的opaque、data、free,然后AVBuffer自己的opaque和free则指
  • 向了BufferPoolEntry和pool_release_buffer
  • pool 当前BufferPoolEntry指向创建他的AVBufferPool. 这样每个BufferPoolEntry都可
  • 以找到创建和管理他的AVBufferPool
  • next
  • buffer 实际存储buffer相关信息,新版本才增加的

AVBufferRef

在libavutil/buffer.h中定义,是对外的,可以在应用程序中直接引用.

  • *buffer
  • *data size AVBufferRef.data和size与AVBuffer.data和size是一致的

有两种方式创建AVBufferRef,一种是通过av_buffer_alloc,只要指定大小即可;另一种是

通过av_buffer_create,这种主要是用于已经有了数据的情况,同时它也支持自定义释放此

数据内存的方法

AVBuffer

在libavutil/buffer_internal.h中定义,为内部数据结构,不能在应用程序中直接引用.

AVBuffer对外不公开,必须要通过AVBufferRef来间接使用AVBuffer.

  • *data 实际存放数据的地址
  • size 实际存放数据的大小
  • refcount 记录当前buffer的引用计数
  • free 回调函数用于释放数据,当引用计数变为0时会被调用来释放内存。
  • opaque 用户自定义需要传递给回调函数参数,对应了回调函数的opaque参数
  • flags 标识一些属性 , AV_BUFFER_FLAG_READONLY
  • 表示只读,引用计数为1时表示只有一个对象引用它,此时是可写的,否则就是只读的
  • flags_internal 标识一些buffer属性, 有BUFFER_FLAG_REALLOCATABLE, BUFFER_FLAG_NO_FREE两个。
  • BUFFER_FLAG_REALLOCATABLE标识是否可以重分配
  • BUFFER_FLAG_NO_FREE标识被其他结构体引用,不能释放.需要手动释放内存.
  • 新版本中
  • 1. BUFFER_FLAG_REALLOCATABLE移动到了flags_internal
  • 2. BUFFER_FLAG_READONLY改为了AV_BUFFER_FLAG_READONLY
  • 3. 新增加了BUFFER_FLAG_NO_FREE

AVBuffer在创建的时候引用计数为1,当调用av_buffer_ref()对其进行操作时,引用计数+1,当

av_buffer_unref对其操作时则引用计数-1(当-1后引用计数为0时,av_buffer_unref将自动释放分配的数据缓存

定义在libavutil/buffer.c中操作接口

Buffer管理

以上的BufferPoolEntry的opaque、data、free都是指向了AVBuffer最开始的opaque、data、free,

然后AVBuffer自己的opaque和free则指向了BufferPoolEntry和pool_release_buffer为何这样设计呢,

因为AVBuffer最终要进行释放的话,那还是得调用它自己最本来的free函数,但是此时由于要放到

缓存池管理,因此在free时不能真正把AVBuffer释放了,因此用BufferPoolEntry来保存AVBuffer真正

的释放内存的函数,然后再用缓存池释放函数pool_release_buffer来代替free函数,这样,当用户

释放的时候,AVBuffer的free函数已经指向了pool_release_buffer函数,因此可以在pool_release_buffer

里把AVBuffer返回给缓存池,等到缓存池自己想要被释放的时候,这个时候缓存池就从BufferPoolEntry

把之前保存的真正释放AVBuffer的函数取出来,进行调用;不得不说,这个设计虽然非常绕,其实很巧妙.

如图:

  • 365行,调用pool.alloc分配一个新的AVBufferRef
  • 370行, 分配一个BufferPoolEntry
  • 376-379行,将AVBufferRef的data, opaque, free赋值给BufferPoolEntry
  • 381-382行,重新赋值AVBuffer.opaque和AVBuffer.free, pool_release_buffer来代替free函数,
  • 用户释放的时并不会真正释放内存而是通过pool_release_buffer将AVBuffer返回
  • 给了缓存池.当用于真正需要释放内存时,再调用BufferPoolEntry.free实现真正意义释放.
  • 以上机制对用户不可见,巧妙将内存释放和缓存池回收buffer结合在一起了.

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例

目录 前言 一、信息网站介绍 1、网站介绍 2、 地震历史信息 3、 历史信息接口分析 二、XxlCrawler组件 1、关于XxlCrawler 2、核心概念介绍 三、实际信息爬取 1、新建maven项目 2、新建model层对象 3、实际爬取 总结 前言 如今,只要谈起网络信息爬取也就…

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议(Hypertext Transfer Protocol,HTTP)是一种请求-响应的协议,用户可以通过HTTP向服务器上传、下载数据。HT…

JavaScript防抖函数执行多个事件处理函数,监听浏览器窗口拖拽事件(Vue防抖函数执行多个事件处理函数)

简介:当用户调整浏览器窗口大小时,浏览器会触发 resize 事件。通常,我们希望在窗口大小改变时执行一些操作,但是如果用户频繁调整窗口大小,可能会导致这些操作被频繁触发,影响页面性能和用户体验。这时候&a…

Java调用WebServices接口

当拿到一个WebServices接口时,首先用接口测试工具调用一下接口,看是否可以正常发送请求和获取返回接口,确保接口是没有问题的,可以用SoapUI工具进行测试。 下面以一个免费的天气预报接口为例,记录整个接口的调用过程。…

初学python记录:力扣2007. 从双倍数组中还原原数组

题目: 一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱 。 给你一个数组 changed ,如果 change 是 双倍 数组,那么请你返…

Python基础:【练手小实验系列】面向对象编程

文章目录 题目练习题1: 定义一个点类练习题2: 创建一个矩形类练习题3: 银行账户类练习题4: 学生信息管理练习题5: 车辆管理系统参考答案练习题1: 定义一个点类练习题2: 创建一个矩形类练习题3: 银行账户类练习题4: 学生信息管理练习题5: 车辆管理系统题目 练习题1: 定义一个点…

如何解决PPT中获取加载项是灰色的,无法链接到Power BI的问题?

问题描述: 最近有朋友留言询问:“在尝试之前我发布的如何在PPT中展示Power BI报告的操作步骤的时候,想要在PPT中展示Power BI报告?只需这样做! (qq.com) 碰到在PowerPoint中【获取加载项选项】是灰色,无法链加载Powe…

CompletableFuture学习

学习目标: 记录学习CompletableFuture的过程 一周掌握 CompletableFuture 学习: CompletableFuture的在工作中的使用 目的: CompletableFuture的使用灵活使用CompletableFuture进行接口优化 使用runAsync,结果无返回值 Execut…

【数据库】Oracle11g与Oceanbase3.2.3对比

一、数据库体系结构对比 数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。 Oracle11g作为传统关系数据库的代表、Oceanbase作为分布式关系数据库的代表,体系结构上的设计差别很大。 &a…

【NLP】大语言模型基础之Transformer结构

大语言模型基础之Transformer结构 1. Transformer结构总览2. 嵌入表示层2. 注意力层3. 前馈层4. 残差连接与层归一化5. 编码器和解码器结构参考文献 Transformer是一种深度学习模型架构,由Vaswani等人于2017年在论文《Attention is All You Need》中首次提出。它在自…

【练习】二分查找思想

🎥 个人主页:Dikz12🔥个人专栏:算法(Java)📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 二分查找算法介绍 1.二分查找 题目描述 讲解 ​编辑 代码实现 2.…

STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程:B站有知公开课【剪映电脑版教程】 主轨:有封面标志的轨道才是主轨。 主轨磁吸:开启后,在主轨上移动素材,自动向前磁吸,在其他轨道上移动无此效果;关闭后,不自动向前磁吸&…

6个步骤轻松实现Postman接口压力测试(建议收藏)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 这里讲是postman做接口并发测试,基础用法不做…

这些年背过的面试题--MySQL篇

MySQL一直是面试中的热点问题,也难道了很多的面试者。其实MySQL没那么难,只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏向底层的知识。 本手册,已总结成完整的PDF文档。想获取该文档&am…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子?波?波粒二象性测不准原理 (不确定原理)叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断,量子力学到底完善吗观测量子纠缠?那我们宏观世…

快慢指针的应用

快慢指针的原理 快慢指针是利用两个指针移动速度的不一样,实现一些有趣的追击行为。就像上学时求解的那些操场上的追击问题一样。 问题1:判断两个链表是否相交。(链表不存在环结构) 形如: 方法:循环第一…

谷歌开源专业代码模型:对硬件要求低,性能超强!

谷歌发布了面向企业、开发人员的全新代码模型Code Gemma,一共有基础预训练、指令微调和快速推理三个版本。 Code Gemma是基于谷歌在今年2月发布的Gemma模型之上开发而成。其参数很小只有20亿和70亿两种,但使用了超过5000亿tokens的代码、数学、文本等数…

Hive字符串匹配函数 LIKE 和 RLIKE 使用示例

Hive字符串匹配函数 LIKE 和 RLIKE 使用示例 1. 在Hive中, LIKE 和 RLIKE 是用于模式匹配的函数,用于在查询中进行字符串匹配。以下是它们的用法总结: LIKE: LIKE 函数用于在Hive中进行简单的模式匹配,通常用于匹配固…