在AVPacket中有两个比较相近的函数av_packet_free和av_free_packet,在看api的时候有些迷茫,不知道如何使用,之后特意看了一下源码,在此记录一下
不多说,直接上源码
//av_free_packet其实就是清空pkt中data以及buf的内容,并没有把pkt的指针清空,我们可以看到其函数内部调用了av_buffer_unref
void av_free_packet(AVPacket *pkt)
{
if (pkt) {
if (pkt->buf)
av_buffer_unref(&pkt->buf);
pkt->data = NULL;
pkt->size = 0;
av_packet_free_side_data(pkt);
}
}
//简单来说,av_buffer_unref只是把pkt的buf置NULL
void av_buffer_unref(AVBufferRef **buf)
{
if (!buf || !*buf)
return;
buffer_replace(buf, NULL);
}
//而其中的sidedata是把额外信息清除了,如果这里不理解,建议深入了解一下AVPacket的sidedata,他是一个类似于数组的东西,在这里就不多说了
void av_packet_free_side_data(AVPacket *pkt)
{
int i;
for (i = 0; i < pkt->side_data_elems; i++)
av_freep(&pkt->side_data[i].data);
av_freep(&pkt->side_data);
pkt->side_data_elems = 0;
}
//而av_packet_free是先把pkt中的内容清空,然后再把指针清空,让pkt彻底无法使用了,如果需要重新使用,需要重新分配内存
void av_packet_free(AVPacket **pkt)
{
if (!pkt || !*pkt)
return;
av_packet_unref(*pkt);
av_freep(pkt);
}
关于二者的使用:
av_free_packet是清空里边的数据,如果不清空会发生什么情况呢,举个简单的例子,一个char数组大小为128,里边有100个字节的内容,第二次使用你没有清空第一次的内容,第二次数据的大小为60,那么第一次的最后40个字节的数据仍会保留,造成数据冗余,极大可能对你的处理造成影响(这个跟自己的处理也有关系,并不一定,只是个简单的例子,大家可以写一个简单的例子测试一下)
av_packet_free类似于free(p;)p=NULL;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2016-07-29 uboot 环境变量
2016-07-29 关于uboot中tftp上传内存数据到tftp服务器
2016-07-29 U-boot的环境变量: bootcmd 和bootargs
2016-07-29 linux中的rootfs/initrd/ramfs/initramfs
2016-07-29 关于Linux启动时挂载rootfs的几种方式
2016-07-29 u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
2016-07-29 linux的几个内核镜像格式Image 和 u-boot启动内核和文件系统时的一些环境变量的设置