#include "avpacket.h"
#define MEM_ITEM_SIZE (20*1024*102)
#define AVPACKET_LOOP_COUNT 1000
// 测试 内存泄漏
/**
* @brief 测试av_packet_alloc和av_packet_free的配对使用
*/
void av_packet_test1()
{
AVPacket *pkt = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE); // 引用计数初始化为1
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
av_packet_unref(pkt); // 要不要调用,无所谓
//其实在av_packet_free上也已经调用了av_packet_unref
//但是在调用av_packet_free时,调用av_init_packet将pkt->side_data_elems = 0;
//pkt->buf = NULL;
//就直接return的
av_packet_free(&pkt); // 如果不free将会发生内存泄漏,内部调用了 av_packet_unref
}
/**
* @brief 测试误用av_init_packet将会导致内存泄漏
*/
void av_packet_test2()
{
AVPacket *pkt = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
// av_init_packet(pkt); // 这个时候init,会导致buffer直接设置为NULL,就会导致内存无法释放
//导致下面的av_packet_free无法正常释放buffer。造成内存泄露。
av_packet_free(&pkt);
}
/**
* @brief 测试av_packet_move_ref后,可以av_init_packet
*/
void av_packet_test3()
{
AVPacket *pkt = NULL;
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_alloc(); // 必须先alloc
av_packet_move_ref(pkt2, pkt);//内部其实也调用了av_init_packet
//av_init_packet(pkt);
av_packet_free(&pkt);
av_packet_free(&pkt2);
}
/**
* @brief 测试av_packet_clone
*/
void av_packet_test4()
{
AVPacket *pkt = NULL;
// av_packet_alloc()没有必要,因为av_packet_clone内部有调用 av_packet_alloc
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_clone(pkt); // av_packet_alloc()+av_packet_ref()
//av_init_packet(pkt);
av_packet_free(&pkt);
av_packet_free(&pkt2);
}
/**
* @brief 测试av_packet_ref
*/
void av_packet_test5()
{
AVPacket *pkt = NULL;
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc(); //
if(pkt->buf) // 打印referenc-counted,必须保证传入的是有效指针
{ printf("%s(%d) ref_count(pkt) = %d\n", __FUNCTION__, __LINE__,
av_buffer_get_ref_count(pkt->buf));
}
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
if(pkt->buf) // 打印referenc-counted,必须保证传入的是有效指针
{ printf("%s(%d) ref_count(pkt) = %d\n", __FUNCTION__, __LINE__,
av_buffer_get_ref_count(pkt->buf));
}
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_alloc(); // 必须先alloc
av_packet_move_ref(pkt2, pkt); // av_packet_move_ref
// av_init_packet(pkt); //av_packet_move_ref
av_packet_ref(pkt, pkt2);
av_packet_ref(pkt, pkt2); // 多次ref如果没有对应多次unref将会内存泄漏
if(pkt->buf) // 打印referenc-counted,必须保证传入的是有效指针
{ printf("%s(%d) ref_count(pkt) = %d\n", __FUNCTION__, __LINE__,
av_buffer_get_ref_count(pkt->buf));
}
if(pkt2->buf) // 打印referenc-counted,必须保证传入的是有效指针
{ printf("%s(%d) ref_count(pkt) = %d\n", __FUNCTION__, __LINE__,
av_buffer_get_ref_count(pkt2->buf));
}
av_packet_unref(pkt); // 将为2
av_packet_unref(pkt); // 做第二次是没有用的
if(pkt->buf)
printf("pkt->buf没有被置NULL\n");
else
printf("pkt->buf已经被置NULL\n");
if(pkt2->buf) // 打印referenc-counted,必须保证传入的是有效指针
{ printf("%s(%d) ref_count(pkt) = %d\n", __FUNCTION__, __LINE__,
av_buffer_get_ref_count(pkt2->buf));
}
av_packet_unref(pkt2);
//此时pkt和pkt2的buffer为null,会导致无法释放资源
av_packet_free(&pkt);
av_packet_free(&pkt2);
}
/**
* @brief 测试AVPacket整个结构体赋值, 和av_packet_move_ref类似
*/
void av_packet_test6()
{
AVPacket *pkt = NULL;
AVPacket *pkt2 = NULL;
int ret = 0;
pkt = av_packet_alloc();
ret = av_new_packet(pkt, MEM_ITEM_SIZE);
memccpy(pkt->data, (void *)&av_packet_test1, 1, MEM_ITEM_SIZE);
pkt2 = av_packet_alloc(); // 必须先alloc
*pkt2 = *pkt; // 有点类似 pkt可以重新分配内存
av_init_packet(pkt);
av_packet_free(&pkt);
av_packet_free(&pkt2);
}
void av_packet_test()
{
av_packet_test1();
// av_packet_test2();
// av_packet_test3();
// av_packet_test4();
// av_packet_test5();
// av_packet_test6();
}
没有合适的资源?快使用搜索试试~ 我知道了~
ffmpeg内存模型AVPacket API和AVFrame API
共13个文件
o:3个
c:3个
h:2个
需积分: 29 0 下载量 61 浏览量
2022-10-27
09:45:27
上传
评论
收藏 261KB RAR 举报
温馨提示
10linux-ffmpeg-buffermode
资源推荐
资源详情
资源评论
收起资源包目录
10linux-ffmpeg-buffermodel.rar (13个子文件)
10linux-ffmpeg-buffermodel
build-10linux-ffmpeg-buffermodel-Desktop_Qt_5_12_10_GCC_64bit-Debug
.qmake.stash 739B
avframe.o 16KB
avpacket.o 12KB
10linux-ffmpeg-buffermodel 763KB
Makefile 53KB
main.o 4KB
10linux-ffmpeg-buffermodel
main.c 167B
avframe.c 2KB
10linux-ffmpeg-buffermodel.pro.user 25KB
avframe.h 112B
10linux-ffmpeg-buffermodel.pro 551B
avpacket.h 2KB
avpacket.c 5KB
共 13 条
- 1
资源评论
权艺
- 粉丝: 133
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功