X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fvideo_filter_graph.cc;h=a61da6773bbb8517330895aa2a8b01eae3e39c76;hb=b88874e34d429b4624965da09edfde3a56329e38;hp=9b297c87bf63549e6736b1134e168c650bd1c026;hpb=35409488fd54aacefa6858dce4b02a576170e76e;p=dcpomatic.git diff --git a/src/lib/video_filter_graph.cc b/src/lib/video_filter_graph.cc index 9b297c87b..a61da6773 100644 --- a/src/lib/video_filter_graph.cc +++ b/src/lib/video_filter_graph.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2018 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,6 +18,7 @@ */ + #include "compose.hpp" #include "image.h" #include "video_filter_graph.h" @@ -25,16 +26,20 @@ extern "C" { #include #include +#include } #include "i18n.h" + using std::list; +using std::make_pair; +using std::make_shared; using std::pair; -using std::vector; +using std::shared_ptr; using std::string; -using std::make_pair; -using boost::shared_ptr; +using std::vector; + VideoFilterGraph::VideoFilterGraph (dcp::Size s, AVPixelFormat p, dcp::Fraction r) : _size (s) @@ -44,21 +49,21 @@ VideoFilterGraph::VideoFilterGraph (dcp::Size s, AVPixelFormat p, dcp::Fraction } + /** 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; -DCPOMATIC_DISABLE_WARNINGS if (_copy) { - images.push_back (make_pair (shared_ptr (new Image (frame)), av_frame_get_best_effort_timestamp (frame))); + images.push_back (make_pair(make_shared(frame), frame->best_effort_timestamp)); } else { 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)); + throw DecodeError (String::compose(N_("could not push buffer into filter chain (%1)."), r)); } while (true) { @@ -66,15 +71,15 @@ DCPOMATIC_DISABLE_WARNINGS break; } - images.push_back (make_pair (shared_ptr (new Image (_frame)), av_frame_get_best_effort_timestamp (_frame))); + images.push_back (make_pair(make_shared(_frame), frame->best_effort_timestamp)); av_frame_unref (_frame); } } -DCPOMATIC_ENABLE_WARNINGS return images; } + /** @param s Image size. * @param p Pixel format. * @return true if this chain can process images with `s' and `p', otherwise false. @@ -85,6 +90,7 @@ VideoFilterGraph::can_process (dcp::Size s, AVPixelFormat p) const return (_size == s && _pixel_format == p); } + string VideoFilterGraph::src_parameters () const { @@ -99,23 +105,23 @@ VideoFilterGraph::src_parameters () const return buffer; } -void * -VideoFilterGraph::sink_parameters () const + +void +VideoFilterGraph::set_parameters (AVFilterContext* context) const { - AVBufferSinkParams* sink_params = av_buffersink_params_alloc (); - AVPixelFormat* pixel_fmts = new AVPixelFormat[2]; - pixel_fmts[0] = _pixel_format; - pixel_fmts[1] = AV_PIX_FMT_NONE; - sink_params->pixel_fmts = pixel_fmts; - return sink_params; + AVPixelFormat pix_fmts[] = { _pixel_format, AV_PIX_FMT_NONE }; + int r = av_opt_set_int_list (context, "pix_fmts", pix_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN); + DCPOMATIC_ASSERT (r >= 0); } + string VideoFilterGraph::src_name () const { return "buffer"; } + string VideoFilterGraph::sink_name () const {