【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
文章目录
- 一、av_packet_ref 函数
- 1、函数原型
- 2、函数源码分析
- 3、函数使用代码示例
- 二、av_packet_clone 函数
- 1、函数原型
- 2、函数源码分析
FFmpeg 4.0 版本源码地址 :
- GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0
- GitCode : https://gitcode.com/gh_mirrors/ff/FFmpeg/tree/release/4.0
- FFmpeg/libavcodec/avpacket.c 源码 : https://gitcode.com/gh_mirrors/ff/FFmpeg/blob/release/4.0/libavcodec/avpacket.c
一、av_packet_ref 函数
1、函数原型
av_packet_ref 函数 用于 将 源 AVPacket 结构体的属性 和 buf 数据引用 拷贝复制给 目标 AVPacket 结构体 , AVPacket 中的 实际数据 不会进行复制 , 新创建的 AVPacket 只会复制 实际音视频数据的 指针地址 , 函数原型如下 :
int av_packet_ref(AVPacket *dst, const AVPacket *src)
-
函数功能 :
- 将 src 的 结构体字段 复制到 dst ;
- 拷贝 数据的引用 , 并增加 src 中底层数据的引用计数 ; 拷贝的是引用 , 不会对 src 中的实际数据缓冲区进行内存复制 , 避免不必要的性能开销 ;
-
参数解析 :
- AVPacket *dst 参数 : 指向 目标 AVPacket 的指针 , 被赋值的对象 ;
- const AVPacket *src 参数 : 指向 源 AVPacket 的指针 , 数据源 , 被拷贝的对象 ;
-
返回值 :
- 拷贝成功 , 返回 0 ;
- 拷贝失败 , 返回 负值 , 该负值表示错误码 ;
2、函数源码分析
av_packet_ref 函数的源码如下 :
- 分析该函数的源码可知 , 该函数执行两个操作 , 分别是 :
- 第一步 : 复制 源 结构体 中的 字段值 到 目标结构体 中 ;
- 第二步 : 将 原结构体 的 数据缓冲区 引用 赋值给 目标 数据缓冲区 引用 , 注意 这里 只 复制引用 , 不复制数据 ;
- 该函数中直接为 AVPacket 结构体字段辅助 , 因此执行该函数之前 , 目标 AVPacket 必须是已经分配好内存 ;
int av_packet_ref(AVPacket *dst, const AVPacket *src)
{int ret;// 复制源包(src)的属性到目标包(dst),包括时间戳、流索引等元数据。ret = av_packet_copy_props(dst, src);if (ret < 0) // 如果属性复制失败,则返回错误码。return ret;// 检查源包是否有缓冲区 (buf),如果没有,说明需要分配新的缓冲区。if (!src->buf) {// 为目标包分配缓冲区,大小为源包的数据大小。ret = packet_alloc(&dst->buf, src->size);if (ret < 0) // 如果缓冲区分配失败,跳转到错误处理。goto fail;// 如果源包的数据大小不为 0,将数据从源包复制到目标包的缓冲区。if (src->size)memcpy(dst->buf->data, src->data, src->size);// 将目标包的 data 指针指向分配的缓冲区。dst->data = dst->buf->data;} else {// 如果源包有缓冲区,通过引用计数创建缓冲区的引用。dst->buf = av_buffer_ref(src->buf);if (!dst->buf) { // 如果引用创建失败,返回内存分配错误。ret = AVERROR(ENOMEM);goto fail;}// 目标包的 data 指针直接指向源包的 data。dst->data = src->data;}// 将源包的大小复制到目标包。dst->size = src->size;// 如果执行成功,返回 0。return 0;fail:// 如果发生错误,释放目标包的附加数据(如 side data)以防止资源泄漏。av_packet_free_side_data(dst);return ret; // 返回错误码。
}
3、函数使用代码示例
代码示例 :
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>int main() {AVPacket src_pkt, dst_pkt;// 初始化源包和目标包// av_init_packet 初始化 AVPacket 结构体,为其成员赋初始值。av_init_packet(&src_pkt);av_init_packet(&dst_pkt);// 为源包分配内存并假设数据已填充// src_pkt.data 指向分配的 100 字节内存,用于模拟填充数据。src_pkt.data = av_malloc(100);src_pkt.size = 100; // 数据大小设置为 100 字节。// 创建引用// av_packet_ref 创建目标包 dst_pkt 对源包 src_pkt 的引用。// 如果失败,打印错误信息并返回 -1。if (av_packet_ref(&dst_pkt, &src_pkt) < 0) {fprintf(stderr, "Failed to create packet reference.\n");return -1;}// 此时,src_pkt 和 dst_pkt 共享同一底层数据// 打印源包和目标包的数据大小以验证共享关系。printf("src size: %d, dst size: %d\n", src_pkt.size, dst_pkt.size);// 释放引用// 使用 av_packet_unref 释放源包和目标包的引用,减少引用计数。av_packet_unref(&src_pkt);av_packet_unref(&dst_pkt);return 0;
}
二、av_packet_clone 函数
1、函数原型
av_packet_clone 函数 用于 克隆一个完整的 AVPacket , 该函数实际上相当于 av_packet_alloc 函数 + av_packet_ref 函数 ;
AVPacket *av_packet_clone(const AVPacket *src)
- const AVPacket *src 参数 : 指向 需要克隆的源 AVPacket 的指针 ;
- 返回值 :
- 拷贝成功 : 返回一个指向 新克隆的 AVPacket 的指针 ;
- 拷贝失败 : 返回 NULL , 通常是因为内存分配失败 ;
2、函数源码分析
在下面的 av_packet_clone 函数源码中可以分析处 , av_packet_clone 函数相当于
av_packet_alloc 函数 和 av_packet_ref 函数 的总体效果 ;
在 av_packet_clone 函数中 , 先调用了 av_packet_alloc 函数 , 创建 目标 AVPacket ,
然后调用 av_packet_ref 函数 , 将 源 AVPacket 的 数据拷贝给 目标 AVPacket ;
AVPacket *av_packet_clone(const AVPacket *src)
{// 为克隆的包分配内存并初始化。// 调用 av_packet_alloc 返回一个新的 AVPacket 指针,默认值为初始状态。AVPacket *ret = av_packet_alloc();// 如果分配失败,直接返回 NULL。if (!ret)return ret;// 使用 av_packet_ref 函数将源包 src 的数据和元信息复制到新包 ret 中。// av_packet_ref 返回非零值表示复制失败。if (av_packet_ref(ret, src))// 如果复制失败,释放已分配的 AVPacket,并将 ret 置为 NULL。av_packet_free(&ret);// 返回克隆后的 AVPacket 指针(成功)或 NULL(失败)。return ret;
}
相关文章:
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...
【学习笔记】量化概述
Quantize量化概念与技术细节 题外话,在七八年前,一些关于表征的研究,会去做表征的压缩,比如二进制嵌入这种事情,其实做得很简单,无非是找个阈值,然后将浮点数划归为零一值,现在的Qu…...
同步互斥相关习题10道 附详解
PV操作 2016 某系统允许最多10个进程同时读文件F,当同时读文件F的进程不满10个时,欲读该文件的其他文件可立即读,当已有10个进程在读文件F时读,其他欲读文件F的进程必须等待,直至有进程读完后退出方可去读 在实现管…...
【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)
【Python PyTorch】卷积神经网络 CNN(LeNet-5网络) 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...
Git 拉取指定分支创建项目
一 背景 因为项目过大,只需要部分分支的代码即可。 二 实现 方法一:使用 --single-branch 参数 git clone 支持只拉取指定分支,而不是整个库的所有分支: git clone --branch <branch_name> --single-branch <reposi…...
CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)
思路:一个二分图是由两个集合组成的,同一个集合中的节点间不能连边,所以一个二分图最多有cnt[1]*cnt[2]条边,题目给出一个树的n-1条边,要我们添加最多的边数使他成为二分图,添加的边数就是cnt[1]*cnt[2]-n1…...
React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
在 React Native 应用中,数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理,包括 React Hooks、Context API 以及第三方状态管理库(如 Redux)。本章节将详细介绍 React Hooks 的基础…...
传奇996_22——自动挂机
登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...
faiss 提供了多种索引类型
faiss 多种索引类型 在 faiss 中,IndexFlatL2 是一个简单的基于 L2 距离(欧几里得距离)进行索引的索引类型,但实际上,faiss 提供了多种索引类型,支持不同的度量方式和性能优化,您可以根据需求选…...
比rsync更强大的文件同步工具rclone
背景 多个复制,拷贝,同步文件场景,最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份,单次性数据备份。 rsync是单线程的,开源的mrsync是多线程的,但适用范围没…...
《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程
1.1 流程和业务流程概念辨析 业务流程建模标准(BPMN)对于业务流程的定义:一个业务流程由为了配合一个组织性或技术环境而一系列活动组成。这些活动共同实现一个业务目标。 业务流程再造最有名的倡导者托马斯.H.达文波特对于流程和业务流程的定义:流程是一组结构化且可度量的…...
解决docker mysql命令行无法输入中文
docker启动时,设置支持中文 docker run --name mysql-container -e MYSQL_ROOT_PASSWORDroot -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci --default-time-zone8:00 进入docker时,指定LANG即可 docker exec -it …...
基于Java Springboot城市公交运营管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
Lc70--319.两个数组的交集(二分查找)---Java版
1.题目描述 2.思路 用集合求交集,因为集合里面的元素要满足不重复、无序、唯一。使得集合在去重、查找和集合操作(如交集、并集、差集等)中非常高效和方便。 3.代码实现 class Solution {public int[] intersection(int[] nums1, int[] nu…...
亿咖通科技应邀出席微软汽车行业智享会,分享ECARX AutoGPT全新实践
11月14日,全球出行科技企业亿咖通科技(纳斯达克股票代码:ECX)应邀于广州参加由微软举行的汽车行业智享会,揭晓了亿咖通科技对“AI定义汽车”时代的洞察与技术布局,分享了亿咖通科技汽车垂直领域大模型ECARX…...
Python教程:运算符重载
在Python中,运算符重载是通过定义特殊方法(也称为魔术方法)来实现的,这些特殊方法允许类的实例像内置类型那样使用运算符。 Python提供了一系列这样的特殊方法,用于重载各种运算符。 以下是一些常见的运算符重载特殊…...
AWTK VSCode 实时预览插件端口冲突的解决办法
AWTK XML UI 预览插件:在 vscode 中实时预览 AWTK XML UI 文件,在 Copilot 的帮助下,可以大幅提高界面的开发效率。 主要特色: 真实的 UI 效果。可以设置主题,方便查看在不同主题下界面的效果。可以设置语言…...
【MySQL系列】深入理解MySQL中的存储、排序字符集
前言 在创建数据库时,我们经常会需要填写数据库的所用字符集、排序规则,字符集和排序规则是两个非常重要的概念,它们决定了数据库如何存储和比较字符串数据。在 MySQL 中,常用的存储字符集有 utf8、utf8mb4,而排序字符…...
RPC-健康检测机制
什么是健康检测? 在真实环境中服务提供方是以一个集群的方式提供服务,这对于服务调用方来说,就是一个接口会有多个服务提供方同时提供服务,调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测,能帮助从连…...
关于Java处理Excel常规列表记录,并入库的操作
1.描述 对于常规的Excel列表(二维表格)的入库处理,一般的mysql连接工具,例如Navicat就支持。但是,因为业务需要,不想每次都去手动导入,所以这里采用编码且定时任务的形式来实现。 2.Excel常规列…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
