当前位置: 首页 > 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常规列…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...