Run premultiply filter on still images that have alpha channels (more of #2681).
authorCarl Hetherington <cth@carlh.net>
Sun, 10 Dec 2023 20:53:38 +0000 (21:53 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 12 Dec 2023 14:03:30 +0000 (15:03 +0100)
src/lib/ffmpeg_image_proxy.cc
test/data

index f513eef2d57cbef6dc58c243f065c797905639eb..2fcd486dfafc72daa641f0a7c50e6c891c8c9d01 100644 (file)
@@ -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);
index c40dcfabfccce346822a662012fa86814206d6a8..154eb8c751e43e350dac04943dc48e6ab7f9c98f 160000 (submodule)
--- a/test/data
+++ b/test/data
@@ -1 +1 @@
-Subproject commit c40dcfabfccce346822a662012fa86814206d6a8
+Subproject commit 154eb8c751e43e350dac04943dc48e6ab7f9c98f