summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-12-10 21:53:38 +0100
committerCarl Hetherington <cth@carlh.net>2023-12-12 15:03:30 +0100
commitfbaade900b1479fafe54bbbe904cf8483a577e94 (patch)
treee2a05c5f56b785332636e71e7ff9dd18a22f4066 /src
parentaa74208713d429aecbf76549d64bb0e3b6cebd4d (diff)
Run premultiply filter on still images that have alpha channels (more of #2681).
Diffstat (limited to 'src')
-rw-r--r--src/lib/ffmpeg_image_proxy.cc16
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);