diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-06-29 16:01:14 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-06-29 16:01:14 +0100 |
| commit | 92c691f29c5da9abca6a06605998e09f9b8103bb (patch) | |
| tree | 1ecd83269fcce0f7bf83279ea4920cdeb5b1a939 /src/lib/j2k_image_proxy.h | |
| parent | 420b50e7e5130194d8e8f4a51514c005e2df3dd0 (diff) | |
Fix handling of incorrectly-recognised JPEG2000 files.
Previously we asked libdcp whether an imported J2K file was
RGB or XYZ. The answer it gives is sometimes wrong, for reasons
that are not clear (either the files are not marked correctly,
or openjpeg is not parsing whatever metadata correctly).
However it seems that, in general, we use the user's specified
colour conversion to decide what to do with an image, rather than
asking the image what should be done to it.
Hence it makes more sense to assume that if a user specifies no
colour conversion for a J2K file then the file is XYZ.
With preview, the colour conversion from XYZ back to RGB is done
by FFmpeg, so we have to set the pixel format correctly on the
Image that comes back from J2KImageProxy. Now we get that pixel
format from the configured colourspace conversion rather than
from openjpeg's guess as to the file's colourspace.
It's a bit ugly that the only thing we ask the file about is whether
or not it is in YUV (which governs whether or not FFmpeg applies
the user's configured YUV-to-RGB conversion). Everything else is
decided by the configured conversion.
I think there's still some uglyness in here that I can't put my
finger on.
Diffstat (limited to 'src/lib/j2k_image_proxy.h')
| -rw-r--r-- | src/lib/j2k_image_proxy.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/lib/j2k_image_proxy.h b/src/lib/j2k_image_proxy.h index 72815a0f6..96a776f2a 100644 --- a/src/lib/j2k_image_proxy.h +++ b/src/lib/j2k_image_proxy.h @@ -30,9 +30,9 @@ namespace dcp { class J2KImageProxy : public ImageProxy { public: - J2KImageProxy (boost::filesystem::path path, dcp::Size); - J2KImageProxy (boost::shared_ptr<const dcp::MonoPictureFrame> frame, dcp::Size); - J2KImageProxy (boost::shared_ptr<const dcp::StereoPictureFrame> frame, dcp::Size, dcp::Eye); + J2KImageProxy (boost::filesystem::path path, dcp::Size, AVPixelFormat pixel_format); + J2KImageProxy (boost::shared_ptr<const dcp::MonoPictureFrame> frame, dcp::Size, AVPixelFormat pixel_format); + J2KImageProxy (boost::shared_ptr<const dcp::StereoPictureFrame> frame, dcp::Size, dcp::Eye, AVPixelFormat pixel_format); J2KImageProxy (boost::shared_ptr<cxml::Node> xml, boost::shared_ptr<Socket> socket); boost::shared_ptr<Image> image (boost::optional<dcp::NoteHandler> note = boost::optional<dcp::NoteHandler> ()) const; @@ -40,7 +40,9 @@ public: void send_binary (boost::shared_ptr<Socket>) const; /** @return true if our image is definitely the same as another, false if it is probably not */ bool same (boost::shared_ptr<const ImageProxy>) const; - AVPixelFormat pixel_format () const; + AVPixelFormat pixel_format () const { + return _pixel_format; + } dcp::Data j2k () const { return _data; @@ -54,11 +56,12 @@ private: friend struct client_server_test_j2k; /* For tests */ - J2KImageProxy (dcp::Data data, dcp::Size size); + J2KImageProxy (dcp::Data data, dcp::Size size, AVPixelFormat pixel_format); void ensure_j2k () const; dcp::Data _data; dcp::Size _size; boost::optional<dcp::Eye> _eye; mutable boost::shared_ptr<dcp::OpenJPEGImage> _j2k; + AVPixelFormat _pixel_format; }; |
