X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fpicture_mxf.cc;h=46aa7752847aa539aaeb790194ccfcf7b293a311;hb=391860586976a6b6309caa56cc1191e1ca9efd06;hp=3221a88f8f1ed046e5328c00744a0ab7bca16ad7;hpb=9fd79fb05fa47833ed431d83d73fd6d9a4a9f774;p=libdcp.git diff --git a/src/picture_mxf.cc b/src/picture_mxf.cc index 3221a88f..46aa7752 100644 --- a/src/picture_mxf.cc +++ b/src/picture_mxf.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,25 +17,21 @@ */ -/** @file src/picture_asset.cc - * @brief An asset made up of JPEG2000 files - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "AS_DCP.h" -#include "KM_fileio.h" #include "picture_mxf.h" #include "util.h" #include "exceptions.h" -#include "xyz_frame.h" +#include "xyz_image.h" #include "picture_mxf_writer.h" +#include "compose.hpp" +#include "AS_DCP.h" +#include "KM_fileio.h" +#include +#include +#include +#include +#include +#include +#include using std::string; using std::ostream; @@ -48,42 +44,34 @@ using std::make_pair; using std::istream; using std::cout; using boost::shared_ptr; -using boost::dynamic_pointer_cast; -using boost::lexical_cast; using namespace dcp; -PictureMXF::PictureMXF (boost::filesystem::path directory, boost::filesystem::path mxf_name) - : MXF (directory, mxf_name) +PictureMXF::PictureMXF (boost::filesystem::path file) + : MXF (file) { } -void -PictureMXF::write_to_cpl (xmlpp::Element* node) const +PictureMXF::PictureMXF (Fraction edit_rate) + : MXF (edit_rate) { - MXF::write_to_cpl (node); - - xmlpp::Node::NodeList c = node->get_children (); - xmlpp::Node::NodeList::iterator i = c.begin(); - while (i != c.end() && (*i)->get_name() != cpl_node_name ()) { - ++i; - } - assert (i != c.end ()); +} - (*i)->add_child ("FrameRate")->add_child_text (lexical_cast (_edit_rate * edit_rate_factor ()) + " 1"); - if (_interop) { - stringstream s; - s << std::fixed << std::setprecision (2) << (float (_size.width) / _size.height); - (*i)->add_child ("ScreenAspectRatio")->add_child_text (s.str ()); - } else { - (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast (_size.width) + " " + lexical_cast (_size.height)); - } +void +PictureMXF::read_picture_descriptor (ASDCP::JP2K::PictureDescriptor const & desc) +{ + _size.width = desc.StoredWidth; + _size.height = desc.StoredHeight; + _edit_rate = Fraction (desc.EditRate.Numerator, desc.EditRate.Denominator); + _intrinsic_duration = desc.ContainerDuration; + _frame_rate = Fraction (desc.SampleRate.Numerator, desc.SampleRate.Denominator); + _screen_aspect_ratio = Fraction (desc.AspectRatio.Numerator, desc.AspectRatio.Denominator); } bool PictureMXF::descriptor_equals ( - ASDCP::JP2K::PictureDescriptor const & a, ASDCP::JP2K::PictureDescriptor const & b, boost::function note + ASDCP::JP2K::PictureDescriptor const & a, ASDCP::JP2K::PictureDescriptor const & b, NoteHandler note ) const { if ( @@ -106,12 +94,12 @@ PictureMXF::descriptor_equals ( // a.QuantizationDefault != b.QuantizationDefault ) { - note (ERROR, "video MXF picture descriptors differ"); + note (DCP_ERROR, "video MXF picture descriptors differ"); return false; } if (a.ContainerDuration != b.ContainerDuration) { - note (ERROR, "video container durations differ"); + note (DCP_ERROR, "video container durations differ"); } // for (unsigned int j = 0; j < ASDCP::JP2K::MaxComponents; ++j) { @@ -125,19 +113,19 @@ PictureMXF::descriptor_equals ( bool PictureMXF::frame_buffer_equals ( - int frame, EqualityOptions opt, boost::function note, + int frame, EqualityOptions opt, NoteHandler note, uint8_t const * data_A, unsigned int size_A, uint8_t const * data_B, unsigned int size_B ) const { if (size_A == size_B && memcmp (data_A, data_B, size_A) == 0) { - note (NOTE, "J2K identical"); + note (DCP_NOTE, "J2K identical"); /* Easy result; the J2K data is identical */ return true; } /* Decompress the images to bitmaps */ - shared_ptr image_A = decompress_j2k (const_cast (data_A), size_A, 0); - shared_ptr image_B = decompress_j2k (const_cast (data_B), size_B, 0); + shared_ptr image_A = decompress_j2k (const_cast (data_A), size_A, 0); + shared_ptr image_B = decompress_j2k (const_cast (data_B), size_B, 0); /* Compare them */ @@ -148,7 +136,7 @@ PictureMXF::frame_buffer_equals ( for (int c = 0; c < 3; ++c) { if (image_A->size() != image_B->size()) { - note (ERROR, "image sizes for frame " + lexical_cast(frame) + " differ"); + note (DCP_ERROR, String::compose ("image sizes for frame %1 differ", frame)); return false; } @@ -174,14 +162,12 @@ PictureMXF::frame_buffer_equals ( double const std_dev = sqrt (double (total_squared_deviation) / abs_diffs.size()); - note (NOTE, "mean difference " + lexical_cast (mean) + ", deviation " + lexical_cast (std_dev)); + note (DCP_NOTE, String::compose ("mean difference %1, deviation %2", mean, std_dev)); if (mean > opt.max_mean_pixel_error) { note ( - ERROR, - "mean " + lexical_cast(mean) + - " out of range " + lexical_cast(opt.max_mean_pixel_error) + - " in frame " + lexical_cast(frame) + DCP_ERROR, + String::compose ("mean %1 out of range %2 in frame %3", mean, opt.max_mean_pixel_error, frame) ); return false; @@ -189,10 +175,8 @@ PictureMXF::frame_buffer_equals ( if (std_dev > opt.max_std_dev_pixel_error) { note ( - ERROR, - "standard deviation " + lexical_cast(std_dev) + - " out of range " + lexical_cast(opt.max_std_dev_pixel_error) + - " in frame " + lexical_cast(frame) + DCP_ERROR, + String::compose ("standard deviation %1 out of range %2 in frame %3", std_dev, opt.max_std_dev_pixel_error, frame) ); return false; @@ -200,12 +184,3 @@ PictureMXF::frame_buffer_equals ( return true; } - -string -PictureMXF::key_type () const -{ - return "MDIK"; -} - - -