X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fmono_picture_asset.cc;h=5aba95d26c12bd7250de5a20bf21676501d9b5a6;hb=refs%2Ftags%2Fv1.8.4;hp=f14e50c2191e9f68843ffda2fb9761a18cc1085b;hpb=6e9b1b0ca5e839bda7b567b609cebb92a1cb95a7;p=libdcp.git diff --git a/src/mono_picture_asset.cc b/src/mono_picture_asset.cc index f14e50c2..5aba95d2 100644 --- a/src/mono_picture_asset.cc +++ b/src/mono_picture_asset.cc @@ -1,127 +1,179 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + libdcp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + 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 boost::shared_ptr; -using boost::dynamic_pointer_cast; +using std::list; +using std::pair; +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 + +static void +storing_note_handler (list>& notes, NoteType t, string s) { - return shared_ptr (new MonoPictureFrame (_file, n, _decryption_context)); + 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 + for (int i = 0; i < _intrinsic_duration; ++i) { if (i >= other_picture->intrinsic_duration()) { - return false; + result = false; } - note (DCP_PROGRESS, String::compose ("Comparing video frame %1 of %2", i, _intrinsic_duration)); - shared_ptr frame_A = get_frame (i); - shared_ptr frame_B = other_picture->get_frame (i); + if (result || opt.keep_going) { - if (!frame_buffer_equals ( - i, opt, note, - frame_A->j2k_data(), frame_A->j2k_size(), - frame_B->j2k_data(), frame_B->j2k_size() - )) { - result = false; - if (!opt.keep_going) { - return result; + 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->data(), frame_A->size(), + frame_B->data(), frame_B->size() + )) { + result = false; + } + +#ifdef LIBDCP_OPENMP +#pragma omp critical +#endif + { + note (NoteType::PROGRESS, String::compose("Compared video frame %1 of %2", i, _intrinsic_duration)); + for (auto const& i: notes) { + note (i.first, i.second); + } } } } @@ -129,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) +{ + /* 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 { - /* 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 MonoPictureAssetReader constructor is private */ + return shared_ptr(new MonoPictureAssetReader(this, key(), standard())); + } string