栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

测试结果

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号