测试AVFrame的空间分配和引用计数接口

AVFrame 结构体分析

AVFrame 相关函数

AVFrame 引用计数 

测试代码 

Test_AVFrame.cpp

#include <iostream>

using namespace std;

extern "C"  // 指定函数是 C 语言函数,函数目标名不包含重载标识,C++ 中调用 C 函数需要使用 extern "C"
{
	// 引用 ffmpeg 头文件
	#include "libavcodec/avcodec.h"
}

// 预处理指令导入库
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")

int main()
{
	cout << "fitst ffmpeg" << endl;

	cout << avcodec_configuration() << endl;

	// 生成一个 AVFrame 对象
	AVFrame* frame1 = av_frame_alloc();
	int ret = 0;

	frame1->width = 400;
	frame1->height = 300;
	frame1->format = AV_PIX_FMT_ABGR;

	// 分配 buf 内存空间,16字节对齐方式,默认为32字节对齐
	ret = av_frame_get_buffer(frame1, 16);

	if (ret != 0)
	{
		char buf[1024] = { 0 };

		av_strerror(ret, buf, sizeof(buf));

		cout << buf << endl;
	}

	if (frame1->data[0] != nullptr)
	{
		cout << "frame->linesize[0] = " << frame1->linesize[0] << endl;
	}

	cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;

	AVFrame* frame2 = av_frame_alloc();

	// 让 frame2 引用 frame1 的 buf,引用计数加一
	av_frame_ref(frame2, frame1);

	cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;
	cout << "frame2->buf[0] ref count = " << av_buffer_get_ref_count(frame2->buf[0]) << endl;

	cout << "av_frame_unref(frame2)" << endl;

	// 将 frame2 中 buf 的引用计数减一,buf 引用计数减为0时,则销毁 buf 所占用的内存空间,并将它的 buf 置为空
	av_frame_unref(frame2);
	cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;

	// 销毁一个 AVFrame 对象,并将它内部的 buf 引用计数减一,buf 引用计数减为0时,则销毁 buf 所占用的内存空间
	av_frame_free(&frame1);
	av_frame_free(&frame2);

	return 0;
}

测试结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值