X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=shared%2Fffmpeg_raii.cpp;fp=shared%2Fffmpeg_raii.cpp;h=746e03d19122da0cd11ad70735670b9b9d318af5;hb=b563b8903fa84bb7fd62d7d0b84b70cb26843dbf;hp=0000000000000000000000000000000000000000;hpb=9b7d691b4cc5db7dbfc18c82e86c1207fcac4722;p=nageru diff --git a/shared/ffmpeg_raii.cpp b/shared/ffmpeg_raii.cpp new file mode 100644 index 0000000..746e03d --- /dev/null +++ b/shared/ffmpeg_raii.cpp @@ -0,0 +1,77 @@ +#include "ffmpeg_raii.h" + +extern "C" { +#include +#include +#include +#include +#include +} + +using namespace std; + +// AVFormatContext + +void avformat_close_input_unique::operator() (AVFormatContext *format_ctx) const +{ + avformat_close_input(&format_ctx); +} + +AVFormatContextWithCloser avformat_open_input_unique( + const char *pathname, AVInputFormat *fmt, + AVDictionary **options) +{ + return avformat_open_input_unique(pathname, fmt, options, AVIOInterruptCB{ nullptr, nullptr }); +} + +AVFormatContextWithCloser avformat_open_input_unique( + const char *pathname, AVInputFormat *fmt, + AVDictionary **options, + const AVIOInterruptCB &interrupt_cb) +{ + AVFormatContext *format_ctx = avformat_alloc_context(); + format_ctx->interrupt_callback = interrupt_cb; + if (avformat_open_input(&format_ctx, pathname, fmt, options) != 0) { + format_ctx = nullptr; + } + return AVFormatContextWithCloser(format_ctx); +} + +// AVCodecContext + +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)); +} + + +// AVCodecParameters + +void avcodec_parameters_free_unique::operator() (AVCodecParameters *codec_par) const +{ + avcodec_parameters_free(&codec_par); +} + +// AVFrame + +void av_frame_free_unique::operator() (AVFrame *frame) const +{ + av_frame_free(&frame); +} + +AVFrameWithDeleter av_frame_alloc_unique() +{ + return AVFrameWithDeleter(av_frame_alloc()); +} + +// SwsContext + +void sws_free_context_unique::operator() (SwsContext *context) const +{ + sws_freeContext(context); +}