当前位置: 首页 > news >正文

【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量化概念与技术细节 题外话&#xff0c;在七八年前&#xff0c;一些关于表征的研究&#xff0c;会去做表征的压缩&#xff0c;比如二进制嵌入这种事情&#xff0c;其实做得很简单&#xff0c;无非是找个阈值&#xff0c;然后将浮点数划归为零一值&#xff0c;现在的Qu…...

同步互斥相关习题10道 附详解

PV操作 2016 某系统允许最多10个进程同时读文件F&#xff0c;当同时读文件F的进程不满10个时&#xff0c;欲读该文件的其他文件可立即读&#xff0c;当已有10个进程在读文件F时读&#xff0c;其他欲读文件F的进程必须等待&#xff0c;直至有进程读完后退出方可去读 在实现管…...

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...

Git 拉取指定分支创建项目

一 背景 因为项目过大&#xff0c;只需要部分分支的代码即可。 二 实现 方法一&#xff1a;使用 --single-branch 参数 git clone 支持只拉取指定分支&#xff0c;而不是整个库的所有分支&#xff1a; git clone --branch <branch_name> --single-branch <reposi…...

CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)

思路&#xff1a;一个二分图是由两个集合组成的&#xff0c;同一个集合中的节点间不能连边&#xff0c;所以一个二分图最多有cnt[1]*cnt[2]条边&#xff0c;题目给出一个树的n-1条边&#xff0c;要我们添加最多的边数使他成为二分图&#xff0c;添加的边数就是cnt[1]*cnt[2]-n1…...

React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础

在 React Native 应用中&#xff0c;数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理&#xff0c;包括 React Hooks、Context API 以及第三方状态管理库&#xff08;如 Redux&#xff09;。本章节将详细介绍 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 中&#xff0c;IndexFlatL2 是一个简单的基于 L2 距离&#xff08;欧几里得距离&#xff09;进行索引的索引类型&#xff0c;但实际上&#xff0c;faiss 提供了多种索引类型&#xff0c;支持不同的度量方式和性能优化&#xff0c;您可以根据需求选…...

比rsync更强大的文件同步工具rclone

背景 多个复制&#xff0c;拷贝&#xff0c;同步文件场景&#xff0c;最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份&#xff0c;单次性数据备份。 rsync是单线程的&#xff0c;开源的mrsync是多线程的&#xff0c;但适用范围没…...

《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程

1.1 流程和业务流程概念辨析 业务流程建模标准(BPMN)对于业务流程的定义:一个业务流程由为了配合一个组织性或技术环境而一系列活动组成。这些活动共同实现一个业务目标。 业务流程再造最有名的倡导者托马斯.H.达文波特对于流程和业务流程的定义:流程是一组结构化且可度量的…...

解决docker mysql命令行无法输入中文

docker启动时&#xff0c;设置支持中文 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时&#xff0c;指定LANG即可 docker exec -it …...

基于Java Springboot城市公交运营管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

Lc70--319.两个数组的交集(二分查找)---Java版

1.题目描述 2.思路 用集合求交集&#xff0c;因为集合里面的元素要满足不重复、无序、唯一。使得集合在去重、查找和集合操作&#xff08;如交集、并集、差集等&#xff09;中非常高效和方便。 3.代码实现 class Solution {public int[] intersection(int[] nums1, int[] nu…...

亿咖通科技应邀出席微软汽车行业智享会,分享ECARX AutoGPT全新实践

11月14日&#xff0c;全球出行科技企业亿咖通科技&#xff08;纳斯达克股票代码&#xff1a;ECX&#xff09;应邀于广州参加由微软举行的汽车行业智享会&#xff0c;揭晓了亿咖通科技对“AI定义汽车”时代的洞察与技术布局&#xff0c;分享了亿咖通科技汽车垂直领域大模型ECARX…...

Python教程:运算符重载

在Python中&#xff0c;运算符重载是通过定义特殊方法&#xff08;也称为魔术方法&#xff09;来实现的&#xff0c;这些特殊方法允许类的实例像内置类型那样使用运算符。 Python提供了一系列这样的特殊方法&#xff0c;用于重载各种运算符。 以下是一些常见的运算符重载特殊…...

AWTK VSCode 实时预览插件端口冲突的解决办法

AWTK XML UI 预览插件&#xff1a;在 vscode 中实时预览 AWTK XML UI 文件&#xff0c;在 Copilot 的帮助下&#xff0c;可以大幅提高界面的开发效率。 主要特色&#xff1a; 真实的 UI 效果。可以设置主题&#xff0c;方便查看在不同主题下界面的效果。可以设置语言&#xf…...

【MySQL系列】深入理解MySQL中的存储、排序字符集

前言 在创建数据库时&#xff0c;我们经常会需要填写数据库的所用字符集、排序规则&#xff0c;字符集和排序规则是两个非常重要的概念&#xff0c;它们决定了数据库如何存储和比较字符串数据。在 MySQL 中&#xff0c;常用的存储字符集有 utf8、utf8mb4&#xff0c;而排序字符…...

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…...

关于Java处理Excel常规列表记录,并入库的操作

1.描述 对于常规的Excel列表&#xff08;二维表格&#xff09;的入库处理&#xff0c;一般的mysql连接工具&#xff0c;例如Navicat就支持。但是&#xff0c;因为业务需要&#xff0c;不想每次都去手动导入&#xff0c;所以这里采用编码且定时任务的形式来实现。 2.Excel常规列…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...