X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fvideo_filter_graph.cc;h=89467ae94e50746dccd5704f8be099bc78b9e9a2;hb=refs%2Fheads%2F2493-player-export-frame;hp=0c7e23b050b2e2b0fe6b98940616df0c83a62529;hpb=952084c4221c5708e02c783284cf0f7239c6b4c4;p=dcpomatic.git diff --git a/src/lib/video_filter_graph.cc b/src/lib/video_filter_graph.cc index 0c7e23b05..89467ae94 100644 --- a/src/lib/video_filter_graph.cc +++ b/src/lib/video_filter_graph.cc @@ -20,9 +20,11 @@ #include "compose.hpp" +#include "dcpomatic_assert.h" +#include "exceptions.h" #include "image.h" +#include "scope_guard.h" #include "video_filter_graph.h" -#include "warnings.h" extern "C" { #include #include @@ -49,13 +51,56 @@ VideoFilterGraph::VideoFilterGraph (dcp::Size s, AVPixelFormat p, dcp::Fraction } +list> +VideoFilterGraph::process(shared_ptr image) +{ + if (_copy) { + return { image }; + } + + auto frame = av_frame_alloc(); + if (!frame) { + throw std::bad_alloc(); + } + + ScopeGuard sg = [&frame]() { av_frame_free(&frame); }; + + for (int i = 0; i < image->planes(); ++i) { + frame->data[i] = image->data()[i]; + frame->linesize[i] = image->stride()[i]; + } + + frame->width = image->size().width; + frame->height = image->size().height; + frame->format = image->pixel_format(); + + int r = av_buffersrc_write_frame(_buffer_src_context, frame); + if (r < 0) { + throw DecodeError(String::compose(N_("could not push buffer into filter chain (%1)."), r)); + } + + list> images; + + while (true) { + if (av_buffersink_get_frame(_buffer_sink_context, _frame) < 0) { + break; + } + + images.push_back(make_shared(_frame, Image::Alignment::PADDED)); + av_frame_unref (_frame); + } + + return images; +} + + /** Take an AVFrame and process it using our configured filters, returning a * set of Images. Caller handles memory management of the input frame. */ -list, int64_t>> +list, int64_t>> VideoFilterGraph::process (AVFrame* frame) { - list, int64_t>> images; + list, int64_t>> images; if (_copy) { images.push_back (make_pair(make_shared(frame, Image::Alignment::PADDED), frame->best_effort_timestamp));