diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-12-10 21:53:38 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-12-12 15:03:30 +0100 |
| commit | fbaade900b1479fafe54bbbe904cf8483a577e94 (patch) | |
| tree | e2a05c5f56b785332636e71e7ff9dd18a22f4066 /src/lib | |
| parent | aa74208713d429aecbf76549d64bb0e3b6cebd4d (diff) | |
Run premultiply filter on still images that have alpha channels (more of #2681).
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/ffmpeg_image_proxy.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/lib/ffmpeg_image_proxy.cc b/src/lib/ffmpeg_image_proxy.cc index f513eef2d..2fcd486df 100644 --- a/src/lib/ffmpeg_image_proxy.cc +++ b/src/lib/ffmpeg_image_proxy.cc @@ -27,6 +27,7 @@ #include "ffmpeg_image_proxy.h" #include "image.h" #include "memory_util.h" +#include "video_filter_graph.h" #include <dcp/raw_convert.h> #include <dcp/warnings.h> LIBDCP_DISABLE_WARNINGS @@ -206,7 +207,20 @@ FFmpegImageProxy::image (Image::Alignment alignment, optional<dcp::Size>) const throw DecodeError (N_("avcodec_receive_frame"), name_for_errors, r, *_path); } - _image = make_shared<Image>(frame, alignment); + if (av_pix_fmt_desc_get(context->pix_fmt)->flags & AV_PIX_FMT_FLAG_ALPHA) { + /* XXX: this repeated setup of a the filter graph could be really slow + * (haven't measured it though). + */ + VideoFilterGraph graph(dcp::Size(frame->width, frame->height), context->pix_fmt, dcp::Fraction(24, 1)); + auto filter = Filter::from_id("premultiply"); + DCPOMATIC_ASSERT(filter); + graph.setup({*filter}); + auto images = graph.process(frame); + DCPOMATIC_ASSERT(images.size() == 1); + _image = images.front().first; + } else { + _image = make_shared<Image>(frame, alignment); + } av_packet_unref (&packet); av_frame_free (&frame); |
