04_FFmpeg常用API及内存模型

news2024/11/23 21:42:01
  • 【说明】课程学习地址:https://ke.qq.com/course/468797

FFmpeg内存模型

FFmpeg内存模型

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);

问题(数据的申请和释放):

  1. av_read_frame读取到一个AVPacket后怎么放入视频包队列?
  2. avcodec_recieve_frame读取到一个AVPacket后怎么放入视频帧队列?

从现有Packet拷贝到一个新的Packet的时候(比如从解码器如何处理Packet),有两种情况:

  • ①两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题。
  • ②两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存空间的copy。

对于第一种情况,可以类比智能指针shared_ptr的实现,即采用引用计数

由此可以理解如下的内存模型

AVPacket和AVFrame内部都有AVBufferRef,AVBufferRef内部使用AVBuffer存储数据,AVBuffer内部有一个计数器

或者更为精确的描述是:

typedef struct AVPacket {
    AVBufferRef *buf;
    int64_t pts;
    int64_t dts;
    uint8_t *data;
    int   size;
    int   stream_index;
    int   flags;
    AVPacketSideData *side_data;
    int side_data_elems;
    int64_t duration;
    int64_t pos;                            ///< byte position in stream, -1 if unknown
} AVPacket;
typedef struct AVBufferRef {
    AVBuffer *buffer;
    uint8_t *data;
    int      size;
} AVBufferRef;
struct AVBuffer {
    uint8_t *data; /**< data described by this buffer */
    int      size; /**< size of data in bytes */

    // 引用计数器
    atomic_uint refcount;
	// 析构函数
    void (*free)(void *opaque, uint8_t *data);
    void *opaque;
    int flags;
};

从源码中也可以看出确实是类似shared_ptr的引用计数,我们在分配内存时也需要注意指向的是数据还是引用计数;AVFrame也是这个原理

FFmpeg AVPacket API

// 分配AVPacket,这时候还没buffer
AVPacket *av_packet_alloc(void);
// 释放AVPacket和alloc成对使用 
void av_packet_free(AVPacket **pkt);

// 初始化AVPacket,只是单纯初始化pkt字段为默认值,不涉及数据和大小
void av_init_packet(AVPacket *pkt);

// 给AVPacket的buf分配内存,引用计数初始化为1
int av_new_packet(AVPacket *pkt, int size);

// 增加引用计数
int av_packet_ref(AVPacket *dst, const AVPacket *src);
// 减少引用计数
int av_packet_ref(AVPacket *pkt);
// 转移引用计数
void av_packet_move_ref(AVPacket *dst, AVPacket *src);
// 等于alloc+ref
AVPacket *av_packet_clone(const AVPacket *src);

FFmpeg AVFrame API

AVFrame *av_frame_alloc(void); // 分配AVFrame
void av_frame_free(AVFrame **frame); //释放AVFrame


int av_frame_ref(AVFrame *dst, const AVFrame *src);
void av_frame_unref(AVFrame *frame);
void av_frame_move_ref(AVFrame *dst, AVFrame *src);

int av_frame_get_buffer(AVFrame *frame, int align); //分配内存
AVFrame *av_frame_clone(const AVFrame *src); //等于alloc+ref

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

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

相关文章

Python高效内存访问,memoryview这个神器你值得拥有!

目录 1、初识memoryview 🌀 1.1 memoryview基础介绍 1.2 为何使用memoryview优化内存访问 1.3 创建memoryview对象实战 示例1:基于bytes创建memoryview 示例2:修改memoryview中的数据 示例3:memoryview与切片 2、深入理解memoryview操作 🔄 2.1 访问与修改数据…

【Java】已解决java.nio.channels.FileLockInterruptionException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.nio.channels.FileLockInterruptionException异常 在Java NIO&#xff08;New I/O&#xff09;中&#xff0c;java.nio.channels.FileLockInterruptionException是一个特殊的异常&am…

tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明

一个这样的组件 我直接上代码了 <template><t-loading size"small" :loading"loading" show-overlay><div class"container" click"refresh"><div v-if"svg" class"svg" v-html"svg&…

VUE3脚手架工具cli配置搭建及创建VUE工程

1、VUE的脚手架工具(CLI&#xff09; 开发大型vue的时候&#xff0c;不能通过html编写一个大型的项目&#xff0c;这个时候需要用到vue的脚手架工具 通过vue的脚手架&#xff0c;可以快速的生成vue工程 1.1、安装nodejs和npm 【下载nodejs】 https://nodejs.org/en 【安装…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

python爬虫学习笔记一(基本概念urllib基础)

学习资料&#xff1a;尚硅谷_爬虫 学习环境: pycharm 一.爬虫基本概念 爬虫定义 > 解释1&#xff1a;通过程序&#xff0c;根据URL进行爬取网页&#xff0c;获取有用信息 > 解释2&#xff1a;使用程序模拟浏览器&#xff0c;向服务器发送请求&#xff0c;获取相应信息…

某程序员:30岁了,老婆管钱,背着我买了50万股票,亏了20w,强制她清仓后又买了36万

“辛辛苦苦攒了几年钱&#xff0c;本想买房买车&#xff0c;结果全被老婆炒股亏掉了&#xff01;” 近日&#xff0c;一位30岁的程序员大哥在网上吐苦水&#xff0c;引发了网友们的热议。 这位程序员大哥和妻子结婚后&#xff0c;一直秉持着“男主外&#xff0c;女主内”的传统…

C++——位图的介绍和使用

位图的介绍 位图的引入 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f; 要判断一个数是否在某一堆数中&#xff0c;我们可能会想到如下方法&#xff1a; 将这一堆数进行排序&#xff0c…

VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后&#xff0c;该单元格就被锁定&#xff0c;不能再编辑。 打开VBE&#xff0c;在工程资源管理器中双击该工作表名称打开其代码模块&#xff0c;在其中输入下面的代码&#xff1a; 假设整个工作表的LockedFalse Private Sub Worksheet_Change(ByVal …

【文献及模型、制图分享】1985-2015年美国坦帕湾流域土地开发利用强度时空变化分析

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

顶顶通呼叫中心中间件-机器人测试流程(mod_cti基于FreeSWITCH)

感兴趣的话可以点后面链接添加联系方式顶顶通小孙 一、打开ccadmin-web并且创建分机 1、登录ccadmin-web 登录地址&#xff1a;http://ddcti.com:88 登录之后根据下图去登录ccadmin-web系统。 2、创建分机 点击呼叫中心 -> 点击分机设置 -> 点击新增&#xff0c;点击…

超级管道,品质非凡——钢塑复合管

钢塑复合管&#xff0c;是一种新型的复合管材&#xff0c;又叫涂塑钢管&#xff0c;涂塑钢管有内涂塑钢管&#xff0c;外涂塑钢管&#xff0c;内外涂塑钢管&#xff0c;外镀锌内涂塑钢管&#xff0c;外3pe防腐内涂塑钢管等。 它结合了钢管和塑料管的优点&#xff0c;具有高强度…

LATR 算法解读

文章目录 1. 论文2. 环境安装3. 代码解读3. 1 初始化 lane query3.1.1 SparseInsDecoder3.1.2 loss 计算3.1.3 初始化instance query3.2 ref points 的生成3.3 lane query 和feats进行attention3.3.1 self attn3.3.1 cross attn4. 参考1. 论文 2. 环境安装 146 [2024-06-20 10…

用自己的数据集训练TimeSformer并转ONNX用c++推理

用自己的数据集训练TimeSformer并转ONNX用c++推理 文章目录 用自己的数据集训练TimeSformer并转ONNX用c++推理下载安装TimeSformer创建分类文件夹创建数据集修改训练配置运行脚本开始训练测试模型模型转为onnx测试一下生成的onnx模型转为用c++推理下载安装TimeSformer TimeSfo…

IDEA中Maven--下载安装自己适配的版本---理解

Maven解释&#xff1a; Maven是一个强大的项目管理工具和构建工具&#xff0c;主要用于Java项目。它能够帮助开发团队管理项目的依赖、构建项目、发布文档和报告&#xff0c;并能够自动化许多重复的任务。 Maven的主要作用包括&#xff1a; 依赖管理&#xff1a;Maven能够管理…

Google Earth Engine(GEE)——checkbox的使用

结果 函数: ui.Checkbox(label, value, onChange, disabled, style) A checkbox with a label. Arguments: label (String, optional): The checkboxs label. Defaults to an empty string. value (Boolean, optional): Whether the checkbox is checked. A nu

SpringBoot 实现RequestBodyAdvice封装统一接受类功能

一、相关往期文章 SpringBootVue实现AOP系统日志功能_aop的vue完整项目 Spring AOP (面向切面编程&#xff09;原理与代理模式—实例演示_面向切面aop原理详解 二、需求分析 按照一般情况&#xff0c;统一接受类可以像以下的方式进行处理&#xff1a; 如果不想使用 Request…

8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 YL69-485/232

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持8个编码器同时计数&#xff0c;可识别正反转 ● 也可以设置作为16路独立DI高速计数器 ● 编码器计数值支持断电自动保存 ● DI输入和电源之间3000V隔离 ● 通过RS-4…

在线二维码解码器:将二维码转换成网址链接

在当今数字化时代&#xff0c;二维码&#xff08;QR码&#xff09;已成为一种便捷的信息传递工具。它不仅可以存储大量数据&#xff0c;还能快速分享信息。然而&#xff0c;有时我们需要将二维码中的内容转换为网址链接&#xff0c;以便在浏览器中直接访问。小编将详细介绍如何…

【Java】已解决java.nio.channels.ClosedChannelException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.ClosedChannelException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.ClosedChannelException是一个常见的异常…