diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dcp_video.cc | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/lib/dcp_video.cc b/src/lib/dcp_video.cc index 823325c3e..fdbd5774f 100644 --- a/src/lib/dcp_video.cc +++ b/src/lib/dcp_video.cc @@ -49,6 +49,9 @@ #include <dcp/warnings.h> LIBDCP_DISABLE_WARNINGS #include <libxml++/libxml++.h> +extern "C" { +#include <libavutil/pixdesc.h> +} LIBDCP_ENABLE_WARNINGS #include <fmt/format.h> #include <boost/asio.hpp> @@ -102,7 +105,11 @@ DCPVideo::convert_to_xyz(shared_ptr<const PlayerVideo> frame) shared_ptr<dcp::OpenJPEGImage> xyz; if (frame->colour_conversion()) { - auto image = frame->image(force(AV_PIX_FMT_RGB48LE), VideoRange::FULL, false); + auto conversion = [](AVPixelFormat fmt) { + return fmt == AV_PIX_FMT_XYZ12LE ? AV_PIX_FMT_XYZ12LE : AV_PIX_FMT_RGB48LE; + }; + + auto image = frame->image(conversion, VideoRange::FULL, false); xyz = dcp::rgb_to_xyz( image->data()[0], image->size(), @@ -110,7 +117,20 @@ DCPVideo::convert_to_xyz(shared_ptr<const PlayerVideo> frame) frame->colour_conversion().get() ); } else { - auto image = frame->image(force(AV_PIX_FMT_RGB48LE), VideoRange::FULL, false); + auto conversion = [](AVPixelFormat fmt) { + auto const descriptor = av_pix_fmt_desc_get(fmt); + if (!descriptor) { + return fmt; + } + + if (descriptor->flags & AV_PIX_FMT_FLAG_RGB) { + return AV_PIX_FMT_RGB48LE; + } + + return AV_PIX_FMT_XYZ12LE; + }; + + auto image = frame->image(conversion, VideoRange::FULL, false); xyz = make_shared<dcp::OpenJPEGImage>(image->data()[0], image->size(), image->stride()[0]); } |
