From 778a9bccf11b06d077eea4b32ccc0baf1e8cf01b Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 28 May 2017 16:12:04 +0200 Subject: [PATCH] Redo the FFmpeg RAII helpers to not store function pointers. --- audio_encoder.cpp | 2 +- ffmpeg_raii.cpp | 15 +++++++-------- ffmpeg_raii.h | 24 ++++++++++++++++-------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/audio_encoder.cpp b/audio_encoder.cpp index aa343da..378f748 100644 --- a/audio_encoder.cpp +++ b/audio_encoder.cpp @@ -193,5 +193,5 @@ AVCodecParametersWithDeleter AudioEncoder::get_codec_parameters() { AVCodecParameters *codecpar = avcodec_parameters_alloc(); avcodec_parameters_from_context(codecpar, ctx); - return AVCodecParametersWithDeleter(codecpar, avcodec_parameters_free_unique); + return AVCodecParametersWithDeleter(codecpar); } diff --git a/ffmpeg_raii.cpp b/ffmpeg_raii.cpp index 74ea3fd..b57de95 100644 --- a/ffmpeg_raii.cpp +++ b/ffmpeg_raii.cpp @@ -11,7 +11,7 @@ using namespace std; // AVFormatContext -void avformat_close_input_unique(AVFormatContext *format_ctx) +void avformat_close_input_unique::operator() (AVFormatContext *format_ctx) const { avformat_close_input(&format_ctx); } @@ -23,40 +23,39 @@ AVFormatContextWithCloser avformat_open_input_unique( if (avformat_open_input(&format_ctx, pathname, fmt, options) != 0) { format_ctx = nullptr; } - return AVFormatContextWithCloser(format_ctx, avformat_close_input_unique); + return AVFormatContextWithCloser(format_ctx); } // AVCodecContext -void avcodec_free_context_unique(AVCodecContext *codec_ctx) +void avcodec_free_context_unique::operator() (AVCodecContext *codec_ctx) const { avcodec_free_context(&codec_ctx); } AVCodecContextWithDeleter avcodec_alloc_context3_unique(const AVCodec *codec) { - return AVCodecContextWithDeleter(avcodec_alloc_context3(codec), avcodec_free_context_unique); + return AVCodecContextWithDeleter(avcodec_alloc_context3(codec)); } // AVCodecParameters -void avcodec_parameters_free_unique(AVCodecParameters *codec_par) +void avcodec_parameters_free_unique::operator() (AVCodecParameters *codec_par) const { avcodec_parameters_free(&codec_par); } - // AVFrame -void av_frame_free_unique(AVFrame *frame) +void av_frame_free_unique::operator() (AVFrame *frame) const { av_frame_free(&frame); } AVFrameWithDeleter av_frame_alloc_unique() { - return AVFrameWithDeleter(av_frame_alloc(), av_frame_free_unique); + return AVFrameWithDeleter(av_frame_alloc()); } diff --git a/ffmpeg_raii.h b/ffmpeg_raii.h index d27c20d..0b11234 100644 --- a/ffmpeg_raii.h +++ b/ffmpeg_raii.h @@ -21,9 +21,11 @@ struct AVInputFormat; // AVFormatContext -void avformat_close_input_unique(AVFormatContext *format_ctx); +struct avformat_close_input_unique { + void operator() (AVFormatContext *format_ctx) const; +}; -typedef std::unique_ptr +typedef std::unique_ptr AVFormatContextWithCloser; AVFormatContextWithCloser avformat_open_input_unique( @@ -31,25 +33,31 @@ AVFormatContextWithCloser avformat_open_input_unique( // AVCodecContext -void avcodec_free_context_unique(AVCodecContext *codec_ctx); +struct avcodec_free_context_unique { + void operator() (AVCodecContext *ctx) const; +}; -typedef std::unique_ptr +typedef std::unique_ptr AVCodecContextWithDeleter; AVCodecContextWithDeleter avcodec_alloc_context3_unique(const AVCodec *codec); // AVCodecParameters -void avcodec_parameters_free_unique(AVCodecParameters *codec_par); +struct avcodec_parameters_free_unique { + void operator() (AVCodecParameters *codec_par) const; +}; -typedef std::unique_ptr +typedef std::unique_ptr AVCodecParametersWithDeleter; // AVFrame -void av_frame_free_unique(AVFrame *frame); +struct av_frame_free_unique { + void operator() (AVFrame *frame) const; +}; -typedef std::unique_ptr +typedef std::unique_ptr AVFrameWithDeleter; AVFrameWithDeleter av_frame_alloc_unique(); -- 2.39.2