FFmpeg中结构释放小函数

简介: 本文介绍了FFmpeg中用于释放不同结构体内存的泛化变参模板函数CleanUp,以及如何特化该模板以释放AVFormatContext、AVCodecContext、AVPacket、AVFrame和uint8_t*类型的内存,并提供了一个测试文件来演示这些函数的使用。

用于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;
}
相关文章
|
2月前
|
API
FFmpeg中AVPacket、AVFrame结构的基本使用
FFmpeg中AVPacket和AVFrame结构的内存分配、释放和引用计数处理,以及如何避免内存泄漏。
58 3
|
5月前
|
存储 编解码 容器
FFmpeg avformat_open_input() 函数返回错误protocol not found解决方法(实测有效!附简单FFMPEG的编解码流程)
我个人出现这个错误的时候是在打开文件时报的错误,开始以为我需要加上资源文件,那样QT确实能检测到文件的存在,但是在Debug中他是检测不到这个文件的。
558 1
|
7月前
|
存储 编解码 索引
了解FFmpeg音频通道布局结构:AVChannelLayout结构体解析
了解FFmpeg音频通道布局结构:AVChannelLayout结构体解析
253 1
|
7月前
|
编解码 算法 C++
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
70 0
|
7月前
|
编解码 测试技术
ffmpeg中的时间单位以及时间转换函数(av_q2d av_rescale_q)
ffmpeg中的时间单位以及时间转换函数(av_q2d av_rescale_q)
205 0
|
7月前
|
算法
FFmpeg关键函数介绍
FFmpeg关键函数介绍
51 0
|
7月前
|
API 开发工具 C语言
解决新版本ffmpeg找不到avpriv_io_delete函数等问题
解决新版本ffmpeg找不到avpriv_io_delete函数等问题
107 0
|
编解码 Android开发
【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
436 0
【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )