X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fmono_picture_asset.cc;h=78ab87098dc6c4c381201bff665e0b3c7500a027;hb=c7208194515e93f85441c76d78d11a47d79b36e1;hp=9d0d14975d3176cc9612d754b8c85961e5c97156;hpb=f9cba324c8160a70b108d9e5b60a4ccad6ee9be2;p=libdcp.git diff --git a/src/mono_picture_asset.cc b/src/mono_picture_asset.cc index 9d0d1497..78ab8709 100644 --- a/src/mono_picture_asset.cc +++ b/src/mono_picture_asset.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of libdcp. @@ -16,60 +16,82 @@ You should have received a copy of the GNU General Public License along with libdcp. If not, see . + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ + +/** @file src/mono_picture_asset.cc + * @brief MonoPictureAsset class + */ + + #include "mono_picture_asset.h" #include "mono_picture_asset_writer.h" -#include "AS_DCP.h" -#include "KM_fileio.h" +#include "mono_picture_asset_reader.h" #include "exceptions.h" #include "dcp_assert.h" #include "mono_picture_frame.h" #include "compose.hpp" +#include +#include + using std::string; using std::vector; using std::list; using std::pair; -using boost::shared_ptr; -using boost::dynamic_pointer_cast; +using std::shared_ptr; +using std::dynamic_pointer_cast; +using std::make_shared; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif using namespace dcp; + MonoPictureAsset::MonoPictureAsset (boost::filesystem::path file) : PictureAsset (file) { ASDCP::JP2K::MXFReader reader; - Kumu::Result_t r = reader.OpenRead (file.string().c_str()); - if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("could not open MXF file for reading", file.string(), r)); + auto r = reader.OpenRead (file.string().c_str()); + if (ASDCP_FAILURE(r)) { + boost::throw_exception (MXFFileError("could not open MXF file for reading", file.string(), r)); } ASDCP::JP2K::PictureDescriptor desc; - if (ASDCP_FAILURE (reader.FillPictureDescriptor (desc))) { - boost::throw_exception (DCPReadError ("could not read video MXF information")); + if (ASDCP_FAILURE (reader.FillPictureDescriptor(desc))) { + boost::throw_exception (ReadError("could not read video MXF information")); } read_picture_descriptor (desc); ASDCP::WriterInfo info; if (ASDCP_FAILURE (reader.FillWriterInfo (info))) { - boost::throw_exception (DCPReadError ("could not read video MXF information")); + boost::throw_exception (ReadError("could not read video MXF information")); } _id = read_writer_info (info); } -MonoPictureAsset::MonoPictureAsset (Fraction edit_rate) - : PictureAsset (edit_rate) + +MonoPictureAsset::MonoPictureAsset (Fraction edit_rate, Standard standard) + : PictureAsset (edit_rate, standard) { } -shared_ptr -MonoPictureAsset::get_frame (int n) const -{ - return shared_ptr (new MonoPictureFrame (_file, n, _decryption_context)); -} static void storing_note_handler (list >& notes, NoteType t, string s) @@ -77,43 +99,49 @@ storing_note_handler (list >& notes, NoteType t, string s notes.push_back (make_pair (t, s)); } + bool MonoPictureAsset::equals (shared_ptr other, EqualityOptions opt, NoteHandler note) const { - if (!dynamic_pointer_cast (other)) { + if (!dynamic_pointer_cast(other)) { return false; } ASDCP::JP2K::MXFReader reader_A; - Kumu::Result_t r = reader_A.OpenRead (_file.string().c_str()); - if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("could not open MXF file for reading", _file.string(), r)); + DCP_ASSERT (_file); + auto r = reader_A.OpenRead (_file->string().c_str()); + if (ASDCP_FAILURE(r)) { + boost::throw_exception (MXFFileError("could not open MXF file for reading", _file->string(), r)); } ASDCP::JP2K::MXFReader reader_B; - r = reader_B.OpenRead (other->file().string().c_str()); + DCP_ASSERT (other->file ()); + r = reader_B.OpenRead (other->file()->string().c_str()); if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("could not open MXF file for reading", other->file().string(), r)); + boost::throw_exception (MXFFileError ("could not open MXF file for reading", other->file()->string(), r)); } ASDCP::JP2K::PictureDescriptor desc_A; if (ASDCP_FAILURE (reader_A.FillPictureDescriptor (desc_A))) { - boost::throw_exception (DCPReadError ("could not read video MXF information")); + boost::throw_exception (ReadError ("could not read video MXF information")); } ASDCP::JP2K::PictureDescriptor desc_B; if (ASDCP_FAILURE (reader_B.FillPictureDescriptor (desc_B))) { - boost::throw_exception (DCPReadError ("could not read video MXF information")); + boost::throw_exception (ReadError ("could not read video MXF information")); } if (!descriptor_equals (desc_A, desc_B, note)) { return false; } - shared_ptr other_picture = dynamic_pointer_cast (other); + auto other_picture = dynamic_pointer_cast (other); DCP_ASSERT (other_picture); bool result = true; + auto reader = start_read (); + auto other_reader = other_picture->start_read (); + #ifdef LIBDCP_OPENMP #pragma omp parallel for #endif @@ -125,15 +153,15 @@ MonoPictureAsset::equals (shared_ptr other, EqualityOptions opt, No if (result || opt.keep_going) { - shared_ptr frame_A = get_frame (i); - shared_ptr frame_B = other_picture->get_frame (i); + auto frame_A = reader->get_frame (i); + auto frame_B = other_reader->get_frame (i); list > notes; if (!frame_buffer_equals ( i, opt, bind (&storing_note_handler, boost::ref(notes), _1, _2), - frame_A->j2k_data(), frame_A->j2k_size(), - frame_B->j2k_data(), frame_B->j2k_size() + frame_A->data(), frame_A->size(), + frame_B->data(), frame_B->size() )) { result = false; } @@ -142,9 +170,9 @@ MonoPictureAsset::equals (shared_ptr other, EqualityOptions opt, No #pragma omp critical #endif { - note (DCP_PROGRESS, String::compose ("Compared video frame %1 of %2", i, _intrinsic_duration)); - for (list >::const_iterator i = notes.begin(); i != notes.end(); ++i) { - note (i->first, i->second); + note (NoteType::PROGRESS, String::compose("Compared video frame %1 of %2", i, _intrinsic_duration)); + for (auto const& i: notes) { + note (i.first, i.second); } } } @@ -153,11 +181,20 @@ MonoPictureAsset::equals (shared_ptr other, EqualityOptions opt, No return result; } + shared_ptr -MonoPictureAsset::start_write (boost::filesystem::path file, Standard standard, bool overwrite) +MonoPictureAsset::start_write (boost::filesystem::path file, bool overwrite) { - /* XXX: can't we use shared_ptr here? */ - return shared_ptr (new MonoPictureAssetWriter (this, file, standard, overwrite)); + /* Can't use make_shared here as the MonoPictureAssetWriter constructor is private */ + return shared_ptr(new MonoPictureAssetWriter(this, file, overwrite)); +} + +shared_ptr +MonoPictureAsset::start_read () const +{ + /* Can't use make_shared here as the MonoPictureAssetReader constructor is private */ + return shared_ptr(new MonoPictureAssetReader(this, key(), standard())); + } string