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

测试AVFrame的空间分配和引用计数接口,第1张

AVFrame 结构体分析

AVFrame 相关函数

AVFrame 引用计数 

测试代码 

Test_AVFrame.cpp

#include 

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;
}

测试结果

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/562270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存