From 1ab2132f5217ae14f3a1aeb34d2f8d8b58d74ed4 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 16 Jul 2012 02:47:12 +0100 Subject: [PATCH] Seems to kind-of build video MXFs. --- TODO | 1 + run/dvdomatic | 2 +- src/lib/make_mxf_job.cc | 76 +++++++++++++++++++++++++++++++++++++++-- src/lib/make_mxf_job.h | 8 +++++ 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 042b761f8..c03b3b762 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,4 @@ +Standardise j2c/j2k Don't start without opendcp tools on path Sort out fight between Job::status and overridden versions; a bit ugly Format name in ~/.dvdomatic screws up with spaces; use ID or something diff --git a/run/dvdomatic b/run/dvdomatic index 23b7d22ed..db8a7c432 100755 --- a/run/dvdomatic +++ b/run/dvdomatic @@ -1,6 +1,6 @@ #!/bin/bash -export LD_LIBRARY_PATH=build/src/lib:build/src/gtk:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=build/src/lib:build/src/gtk:build/src/asdcplib/src:$LD_LIBRARY_PATH if [ "$1" == "--debug" ]; then gdb --args build/src/tools/dvdomatic $2 elif [ "$1" == "--valgrind" ]; then diff --git a/src/lib/make_mxf_job.cc b/src/lib/make_mxf_job.cc index 34f115e98..d66ea3e1e 100644 --- a/src/lib/make_mxf_job.cc +++ b/src/lib/make_mxf_job.cc @@ -24,6 +24,7 @@ #include #include #include "AS_DCP.h" +#include "KM_fileio.h" #include "make_mxf_job.h" #include "film.h" #include "film_state.h" @@ -101,7 +102,7 @@ MakeMXFJob::run () break; } - std::list files; + list files; for (filesystem::directory_iterator i = filesystem::directory_iterator (dir); i != filesystem::directory_iterator(); ++i) { files.push_back (filesystem::path (*i).string()); } @@ -110,6 +111,8 @@ MakeMXFJob::run () throw EncodeError ("no input files found for MXF"); } + files.sort (); + ASDCP::EssenceType_t essence_type; if (ASDCP_FAILURE (ASDCP::RawEssenceType (files.front().c_str(), essence_type))) { throw EncodeError ("could not work out type for MXF"); @@ -117,11 +120,11 @@ MakeMXFJob::run () switch (essence_type) { case ASDCP::ESS_JPEG_2000: - /* XXX */ + j2k (files, _fs->file ("video.mxf")); break; case ASDCP::ESS_PCM_24b_48k: case ASDCP::ESS_PCM_24b_96k: - /* XXX */ + wav (files, _fs->file ("audio.mxf")); break; default: throw EncodeError ("unknown essence type"); @@ -129,3 +132,70 @@ MakeMXFJob::run () set_progress (1); } + +void +MakeMXFJob::wav (list const & files, string const & mxf) +{ + +} + +void +MakeMXFJob::j2k (list const & files, string const & mxf) +{ + /* Arbitrarily assume that the J2K MXF will take 90% of the time */ + descend (0.9); + + ASDCP::JP2K::CodestreamParser j2k_parser; + ASDCP::JP2K::FrameBuffer frame_buffer (4 * Kumu::Megabyte); + if (ASDCP_FAILURE (j2k_parser.OpenReadFrame (files.front().c_str(), frame_buffer))) { + throw EncodeError ("could not open J2K file for reading"); + } + + ASDCP::JP2K::PictureDescriptor picture_desc; + j2k_parser.FillPictureDescriptor (picture_desc); + /* XXX: we round for DCP: not sure if this is right */ + picture_desc.EditRate = ASDCP::Rational (rintf (_fs->frames_per_second), 1); + + ASDCP::WriterInfo writer_info; + fill_writer_info (&writer_info); + + ASDCP::JP2K::MXFWriter mxf_writer; + if (ASDCP_FAILURE (mxf_writer.OpenWrite (mxf.c_str(), writer_info, picture_desc))) { + throw EncodeError ("could not open MXF for writing"); + } + + int j = 0; + for (list::const_iterator i = files.begin(); i != files.end(); ++i) { + if (ASDCP_FAILURE (j2k_parser.OpenReadFrame (i->c_str(), frame_buffer))) { + throw EncodeError ("could not open J2K file for reading"); + } + + /* XXX: passing 0 to WriteFrame ok? */ + if (ASDCP_FAILURE (mxf_writer.WriteFrame (frame_buffer, 0, 0))) { + throw EncodeError ("error in writing video MXF"); + } + + ++j; + set_progress (float (j) / files.size ()); + } + + if (ASDCP_FAILURE (mxf_writer.Finalize())) { + throw EncodeError ("error in finalising video MXF"); + } + + ascend (); +} + +void +MakeMXFJob::fill_writer_info (ASDCP::WriterInfo* writer_info) +{ + writer_info->ProductVersion = DVDOMATIC_VERSION; + writer_info->CompanyName = "dvd-o-matic"; + writer_info->ProductName = "dvd-o-matic"; + + /* set the label type */ + writer_info->LabelSetType = ASDCP::LS_MXF_INTEROP; + + /* generate a random UUID for this essence */ + Kumu::GenRandomUUID (writer_info->AssetUUID); +} diff --git a/src/lib/make_mxf_job.h b/src/lib/make_mxf_job.h index b433bdeca..90542561a 100644 --- a/src/lib/make_mxf_job.h +++ b/src/lib/make_mxf_job.h @@ -23,6 +23,10 @@ #include "shell_command_job.h" +namespace ASDCP { + class WriterInfo; +} + class FilmState; class Options; @@ -43,6 +47,10 @@ public: void run (); private: + void j2k (std::list const &, std::string const &); + void wav (std::list const &, std::string const &); + void fill_writer_info (ASDCP::WriterInfo *); + Type _type; }; -- 2.30.2