X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fmono_picture_frame.cc;h=689a8b21f6c199b6ce6d7fb39cacd94c43161607;hb=edf35a7acb05289dc024733efd6e13205def5174;hp=c2f8abb712f6950703c8c417f40397cc20d68ff1;hpb=ac265d3d008328b9bdaf00c39ebcd86f263605c7;p=libdcp.git diff --git a/src/mono_picture_frame.cc b/src/mono_picture_frame.cc index c2f8abb7..689a8b21 100644 --- a/src/mono_picture_frame.cc +++ b/src/mono_picture_frame.cc @@ -23,10 +23,9 @@ #include "mono_picture_frame.h" #include "exceptions.h" -#include "argb_frame.h" -#include "gamma_lut.h" #include "util.h" #include "rgb_xyz.h" +#include "colour_conversion.h" #include "KM_fileio.h" #include "AS_DCP.h" #include @@ -35,8 +34,27 @@ using std::string; using boost::shared_ptr; +using boost::optional; using namespace dcp; +/** Make a picture frame from a JPEG2000 file. + * @param path Path to JPEG2000 file. + */ +MonoPictureFrame::MonoPictureFrame (boost::filesystem::path path) +{ + boost::uintmax_t const size = boost::filesystem::file_size (path); + _buffer = new ASDCP::JP2K::FrameBuffer (size); + FILE* f = fopen_boost (path, "r"); + if (!f) { + boost::throw_exception (FileError ("could not open JPEG2000 file", path, errno)); + } + + fread (j2k_data(), 1, size, f); + fclose (f); + + _buffer->Size (size); +} + /** Make a picture frame from a 2D (monoscopic) asset. * @param mxf_path Path to the asset's MXF file. * @param n Frame within the asset, not taking EntryPoint into account. @@ -58,6 +76,11 @@ MonoPictureFrame::MonoPictureFrame (boost::filesystem::path mxf_path, int n, ASD } } +MonoPictureFrame::MonoPictureFrame () +{ + _buffer = new ASDCP::JP2K::FrameBuffer (4 * Kumu::Megabyte); +} + /** MonoPictureFrame destructor */ MonoPictureFrame::~MonoPictureFrame () { @@ -71,6 +94,13 @@ MonoPictureFrame::j2k_data () const return _buffer->RoData (); } +/** @return Pointer to JPEG2000 data */ +uint8_t * +MonoPictureFrame::j2k_data () +{ + return _buffer->Data (); +} + /** @return Size of JPEG2000 data in bytes */ int MonoPictureFrame::j2k_size () const @@ -81,18 +111,9 @@ MonoPictureFrame::j2k_size () const /** @param reduce a factor by which to reduce the resolution * of the image, expressed as a power of two (pass 0 for no * reduction). - * @param srgb_gamma Reciprocal of output gamma to use after - * the conversion from XYZ to RGB. - * - * @return An ARGB representation of this frame. This is ARGB in the - * Cairo sense, so that each pixel takes up 4 bytes; the first byte - * is blue, second green, third red and fourth alpha (always 255). */ -shared_ptr -MonoPictureFrame::argb_frame (int reduce, float srgb_gamma) const +shared_ptr +MonoPictureFrame::xyz_image (int reduce) const { - return xyz_to_rgb ( - decompress_j2k (const_cast (_buffer->RoData()), _buffer->Size(), reduce), - GammaLUT::cache.get (12, DCI_GAMMA, false), GammaLUT::cache.get (12, 1 / srgb_gamma, false) - ); + return decompress_j2k (const_cast (_buffer->RoData()), _buffer->Size(), reduce); }