summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-07-16 02:47:12 +0100
committerCarl Hetherington <cth@carlh.net>2012-07-16 02:47:12 +0100
commit1ab2132f5217ae14f3a1aeb34d2f8d8b58d74ed4 (patch)
treecf77deccf4fe8410b061c4c6c7c675de7dc97d11 /src/lib
parented2505efba6defd16a1845fd0d3586d7758c3729 (diff)
Seems to kind-of build video MXFs.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/make_mxf_job.cc76
-rw-r--r--src/lib/make_mxf_job.h8
2 files changed, 81 insertions, 3 deletions
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 <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);
+}
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<std::string> const &, std::string const &);
+ void wav (std::list<std::string> const &, std::string const &);
+ void fill_writer_info (ASDCP::WriterInfo *);
+
Type _type;
};