X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=shared%2Fffmpeg_raii.cpp;h=f77dfabb4d820784b41df91357e2e9b61aa30a6b;hb=0bdbbba1317249eb48042d1e1e8ad2e13f6f6100;hp=746e03d19122da0cd11ad70735670b9b9d318af5;hpb=eeda8995329601f9f4e35047358400833eeae68e;p=nageru diff --git a/shared/ffmpeg_raii.cpp b/shared/ffmpeg_raii.cpp index 746e03d..f77dfab 100644 --- a/shared/ffmpeg_raii.cpp +++ b/shared/ffmpeg_raii.cpp @@ -18,20 +18,45 @@ void avformat_close_input_unique::operator() (AVFormatContext *format_ctx) const } AVFormatContextWithCloser avformat_open_input_unique( - const char *pathname, AVInputFormat *fmt, + const char *pathname, const 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, + const char *pathname, const AVInputFormat *fmt, AVDictionary **options, const AVIOInterruptCB &interrupt_cb) { AVFormatContext *format_ctx = avformat_alloc_context(); format_ctx->interrupt_callback = interrupt_cb; +#ifdef ff_const59 + if (avformat_open_input(&format_ctx, pathname, const_cast(fmt), options) != 0) { +#else if (avformat_open_input(&format_ctx, pathname, fmt, options) != 0) { +#endif + format_ctx = nullptr; + } + return AVFormatContextWithCloser(format_ctx); +} + +AVFormatContextWithCloser avformat_open_input_unique( + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + void *opaque, const AVInputFormat *fmt, AVDictionary **options, + const AVIOInterruptCB &interrupt_cb) +{ + AVFormatContext *format_ctx = avformat_alloc_context(); + format_ctx->interrupt_callback = interrupt_cb; + constexpr size_t buf_size = 4096; + unsigned char *buf = (unsigned char *)av_malloc(buf_size); + format_ctx->pb = avio_alloc_context(buf, buf_size, /*write_flag=*/false, opaque, + read_packet, /*write_packet=*/nullptr, /*seek=*/nullptr); +#ifdef ff_const59 + if (avformat_open_input(&format_ctx, "", const_cast(fmt), options) != 0) { +#else + if (avformat_open_input(&format_ctx, "", fmt, options) != 0) { +#endif format_ctx = nullptr; } return AVFormatContextWithCloser(format_ctx); @@ -69,6 +94,17 @@ AVFrameWithDeleter av_frame_alloc_unique() return AVFrameWithDeleter(av_frame_alloc()); } +// AVPacket +void av_packet_free_unique::operator() (AVPacket *packet) const +{ + av_packet_unref(packet); +} + +AVPacketWithDeleter av_packet_alloc_unique() +{ + return AVPacketWithDeleter(av_packet_alloc()); +} + // SwsContext void sws_free_context_unique::operator() (SwsContext *context) const