Seems to kind-of build video MXFs.
authorCarl Hetherington <cth@carlh.net>
Mon, 16 Jul 2012 01:47:12 +0000 (02:47 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 16 Jul 2012 01:47:12 +0000 (02:47 +0100)
TODO
run/dvdomatic
src/lib/make_mxf_job.cc
src/lib/make_mxf_job.h

diff --git a/TODO b/TODO
index 042b761f8c0850b704b5892daf801708a0ab718f..c03b3b76223c2a90389bbd951e7f67caad4301b1 100644 (file)
--- 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
index 23b7d22edef392396d1d3b88808743ec5493cec0..db8a7c4327eb2e5d7f32592ffa8c4b33033352e4 100755 (executable)
@@ -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
index 34f115e9811367ea71b5cbc69d6259c6829220c0..d66ea3e1e9b36f88700271b5a75c85041a926992 100644 (file)
@@ -24,6 +24,7 @@
 #include <iostream>
 #include <boost/filesystem.hpp>
 #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<std::string> files;
+       list<string> 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<string> const & files, string const & mxf)
+{
+
+}
+
+void
+MakeMXFJob::j2k (list<string> 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<string>::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);
+}
index b433bdecac258936059b8ac8d2365e41f21b086f..90542561a3baf1f44b1a80e4045901f249eb662e 100644 (file)
 
 #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<std::string> const &, std::string const &);
+       void wav (std::list<std::string> const &, std::string const &);
+       void fill_writer_info (ASDCP::WriterInfo *);
+       
        Type _type;
 };