FFmpeg中结构释放小函数

用于FFmpeg一些结构内存释放问题

#pragma once
#include <iostream>

extern "C"
{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libavutil/avutil.h"
#include "libavutil/frame.h"
#include "libavcodec/packet.h"
}

// 泛化变参模板 ///
template <typename T, typename... Args>
void CleanUp(T* para, Args&&... args)
{
	CleanUp(para);	
	CleanUp(std::forward<Args>(args)...);
}

 特化模板 /
template<>
inline void CleanUp<AVFormatContext*>(AVFormatContext** pp_fmt_ctx) {	
	if (pp_fmt_ctx && *pp_fmt_ctx) {
		avformat_close_input(pp_fmt_ctx);
		pp_fmt_ctx = nullptr;
	}
}

template<>
inline void CleanUp<AVCodecContext*>(AVCodecContext** pp_codec_cxt) {
	if (pp_codec_cxt && *pp_codec_cxt) {
		avcodec_free_context(pp_codec_cxt);
		pp_codec_cxt = nullptr;
	}
}

template<>
inline void CleanUp<AVPacket*>(AVPacket** pp_pkt) {
	if (pp_pkt && *pp_pkt) {
		av_packet_free(pp_pkt);
		pp_pkt = nullptr;
	}
}

template<>
inline void CleanUp<AVFrame*>(AVFrame** pp_frame) {
	if (pp_frame && *pp_frame) {
		av_frame_free(pp_frame);
		pp_frame = nullptr;
	}
}

template<>
inline void CleanUp<uint8_t*>(uint8_t** u8_buffer) {
	if (u8_buffer && *u8_buffer) {
		av_freep(*u8_buffer);
		u8_buffer = nullptr;
	}
}

template<>
inline void CleanUp<FILE*>(FILE** pp_fp) {
	if (pp_fp && *pp_fp) {
		fclose(*pp_fp);
		pp_fp = nullptr;
	}
}

测试文件

// 资源释放测试
#include "CDestroyRes.h"
#include "vld.h"
#include <iostream>

extern "C"
{
#include <libavutil/avutil.h>
}
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "vld.lib")

int main()
{
	int n = 100;
	while (--n)
	{
		AVFormatContext* fmt_ctx = avformat_alloc_context();
		const AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_H264);
		AVCodecContext* encoder = avcodec_alloc_context3(codec);
		AVPacket* pkt = av_packet_alloc();
		AVFrame* frame = av_frame_alloc();
		frame->width = 1280;
		frame->height = 640;
		frame->format = AV_PIX_FMT_ARGB;
		av_frame_get_buffer(frame, 0);
		CleanUp(&fmt_ctx, &encoder, &pkt, &frame);
	}

	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石小浪♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值