-
-MonoPictureAsset::MonoPictureAsset (
- boost::function<string (int)> get_path,
- string directory,
- string mxf_name,
- boost::signals2::signal<void (float)>* progress,
- int fps,
- int intrinsic_duration,
- bool encrypted,
- Size size,
- MXFMetadata const & metadata
- )
- : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size)
-{
- construct (get_path, metadata);
-}
-
-MonoPictureAsset::MonoPictureAsset (
- vector<string> const & files,
- string directory,
- string mxf_name,
- boost::signals2::signal<void (float)>* progress,
- int fps,
- int intrinsic_duration,
- bool encrypted,
- Size size,
- MXFMetadata const & metadata
- )
- : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size)
-{
- construct (boost::bind (&MonoPictureAsset::path_from_list, this, _1, files), metadata);
-}
-
-MonoPictureAsset::MonoPictureAsset (string directory, string mxf_name, int fps, Size size)
- : PictureAsset (directory, mxf_name, 0, fps, 0, false, size)
-{
-
-}
-
-MonoPictureAsset::MonoPictureAsset (string directory, string mxf_name)
- : PictureAsset (directory, mxf_name)
-{
- ASDCP::JP2K::MXFReader reader;
- if (ASDCP_FAILURE (reader.OpenRead (path().string().c_str()))) {
- boost::throw_exception (MXFFileError ("could not open MXF file for reading", path().string()));
- }
-
- ASDCP::JP2K::PictureDescriptor desc;
- if (ASDCP_FAILURE (reader.FillPictureDescriptor (desc))) {
- boost::throw_exception (DCPReadError ("could not read video MXF information"));
- }
-
- _size.width = desc.StoredWidth;
- _size.height = desc.StoredHeight;
- _edit_rate = desc.EditRate.Numerator;
- assert (desc.EditRate.Denominator == 1);
- _intrinsic_duration = desc.ContainerDuration;
-}
-
-void
-MonoPictureAsset::construct (boost::function<string (int)> get_path, MXFMetadata const & metadata)
-{
- ASDCP::JP2K::CodestreamParser j2k_parser;
- ASDCP::JP2K::FrameBuffer frame_buffer (4 * Kumu::Megabyte);
- if (ASDCP_FAILURE (j2k_parser.OpenReadFrame (get_path(0).c_str(), frame_buffer))) {
- boost::throw_exception (FileError ("could not open JPEG2000 file for reading", get_path (0)));
- }
-
- ASDCP::JP2K::PictureDescriptor picture_desc;
- j2k_parser.FillPictureDescriptor (picture_desc);
- picture_desc.EditRate = ASDCP::Rational (_edit_rate, 1);
-
- ASDCP::WriterInfo writer_info;
- fill_writer_info (&writer_info, _uuid, metadata);
-
- ASDCP::JP2K::MXFWriter mxf_writer;
- if (ASDCP_FAILURE (mxf_writer.OpenWrite (path().string().c_str(), writer_info, picture_desc, 16384, false))) {
- boost::throw_exception (MXFFileError ("could not open MXF file for writing", path().string()));
- }
-
- for (int i = 0; i < _intrinsic_duration; ++i) {
-
- string const path = get_path (i);
-
- if (ASDCP_FAILURE (j2k_parser.OpenReadFrame (path.c_str(), frame_buffer))) {
- boost::throw_exception (FileError ("could not open JPEG2000 file for reading", path));
- }
-
- if (ASDCP_FAILURE (mxf_writer.WriteFrame (frame_buffer, _encryption_context, 0))) {
- boost::throw_exception (MXFFileError ("error in writing video MXF", this->path().string()));
- }
-
- if (_progress) {
- (*_progress) (0.5 * float (i) / _intrinsic_duration);
- }
- }
-
- if (ASDCP_FAILURE (mxf_writer.Finalize())) {
- boost::throw_exception (MXFFileError ("error in finalising video MXF", path().string()));
- }
-}
-
-string
-MonoPictureAsset::path_from_list (int f, vector<string> const & files) const
-{
- return files[f];
-}
-
-shared_ptr<const MonoPictureFrame>
-MonoPictureAsset::get_frame (int n) const
-{
- return shared_ptr<const MonoPictureFrame> (new MonoPictureFrame (path().string(), n));
-}
-
-
-bool
-MonoPictureAsset::equals (shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, string)> note) const
-{
- if (!PictureAsset::equals (other, opt, note)) {
- return false;
- }
-
- shared_ptr<const MonoPictureAsset> other_picture = dynamic_pointer_cast<const MonoPictureAsset> (other);
- assert (other_picture);
-
- for (int i = 0; i < _intrinsic_duration; ++i) {
- note (PROGRESS, "Comparing video frame " + lexical_cast<string> (i) + " of " + lexical_cast<string> (_intrinsic_duration));
- shared_ptr<const MonoPictureFrame> frame_A = get_frame (i);
- shared_ptr<const MonoPictureFrame> frame_B = other_picture->get_frame (i);
-
- if (!frame_buffer_equals (
- i, opt, note,
- frame_A->j2k_data(), frame_A->j2k_size(),
- frame_B->j2k_data(), frame_B->j2k_size()
- )) {
- return false;
- }
- }
-
- return true;
-}
-
-bool
-StereoPictureAsset::equals (shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, string)> note) const
-{
- if (!PictureAsset::equals (other, opt, note)) {
- return false;
- }
-
- shared_ptr<const StereoPictureAsset> other_picture = dynamic_pointer_cast<const StereoPictureAsset> (other);
- assert (other_picture);
-
- for (int i = 0; i < _intrinsic_duration; ++i) {
- shared_ptr<const StereoPictureFrame> frame_A = get_frame (i);
- shared_ptr<const StereoPictureFrame> frame_B = other_picture->get_frame (i);
-
- if (!frame_buffer_equals (
- i, opt, note,
- frame_A->left_j2k_data(), frame_A->left_j2k_size(),
- frame_B->left_j2k_data(), frame_B->left_j2k_size()
- )) {
- return false;
- }
-
- if (!frame_buffer_equals (
- i, opt, note,
- frame_A->right_j2k_data(), frame_A->right_j2k_size(),
- frame_B->right_j2k_data(), frame_B->right_j2k_size()
- )) {
- return false;
- }
- }
-
- return true;
-}
-