Add reel index/count to DCP filename format.
authorCarl Hetherington <cth@carlh.net>
Fri, 29 Jul 2016 22:15:26 +0000 (23:15 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 29 Jul 2016 22:15:26 +0000 (23:15 +0100)
cscript
src/lib/reel_writer.cc
src/lib/reel_writer.h
src/lib/util.cc
src/lib/util.h
src/lib/writer.cc
src/wx/config_dialog.cc
src/wx/name_format_editor.h

diff --git a/cscript b/cscript
index 2ce67238587634bef7c57a64a21cdebd5a57f883..5d0c949e8f6e319808d7e26c11fc7c35fa9fb467 100644 (file)
--- a/cscript
+++ b/cscript
@@ -237,7 +237,7 @@ def dependencies(target):
         ffmpeg_options = {}
 
     return (('ffmpeg-cdist', '1d4a1a4', ffmpeg_options),
-            ('libdcp', '7e9ad08'),
+            ('libdcp', 'f3fb557'),
             ('libsub', '067c21c'))
 
 def configure_options(target):
index d576eb2a0bfad1c0eb12ce827be8525bd87ace02..b712ac3c5a791a1d071af090be051840ff012787 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -60,13 +60,15 @@ using dcp::Data;
 
 int const ReelWriter::_info_size = 48;
 
-ReelWriter::ReelWriter (shared_ptr<const Film> film, DCPTimePeriod period, shared_ptr<Job> job)
+ReelWriter::ReelWriter (shared_ptr<const Film> film, DCPTimePeriod period, shared_ptr<Job> job, int reel_index, int reel_count)
        : _film (film)
        , _period (period)
        , _first_nonexistant_frame (0)
        , _last_written_video_frame (-1)
        , _last_written_eyes (EYES_RIGHT)
        , _total_written_audio_frames (0)
+       , _reel_index (reel_index)
+       , _reel_count (reel_count)
 {
        /* Create our picture asset in a subdirectory, named according to those
           film's parameters which affect the video output.  We will hard-link
@@ -111,7 +113,7 @@ ReelWriter::ReelWriter (shared_ptr<const Film> film, DCPTimePeriod period, share
                   of the DCP directory until the last minute.
                */
                _sound_asset_writer = _sound_asset->start_write (
-                       _film->directory() / audio_asset_filename (_sound_asset),
+                       _film->directory() / audio_asset_filename (_sound_asset, _reel_index, _reel_count),
                        _film->interop() ? dcp::INTEROP : dcp::SMPTE
                        );
        }
@@ -266,7 +268,7 @@ ReelWriter::finish ()
                boost::filesystem::path video_from = _picture_asset->file ();
                boost::filesystem::path video_to;
                video_to /= _film->dir (_film->dcp_name());
-               video_to /= video_asset_filename (_picture_asset);
+               video_to /= video_asset_filename (_picture_asset, _reel_index, _reel_count);
 
                boost::system::error_code ec;
                boost::filesystem::create_hard_link (video_from, video_to, ec);
@@ -286,13 +288,14 @@ ReelWriter::finish ()
        if (_sound_asset) {
                boost::filesystem::path audio_to;
                audio_to /= _film->dir (_film->dcp_name ());
-               audio_to /= audio_asset_filename (_sound_asset);
+               string const aaf = audio_asset_filename (_sound_asset, _reel_index, _reel_count);
+               audio_to /= aaf;
 
                boost::system::error_code ec;
-               boost::filesystem::rename (_film->file (audio_asset_filename (_sound_asset)), audio_to, ec);
+               boost::filesystem::rename (_film->file (aaf), audio_to, ec);
                if (ec) {
                        throw FileError (
-                               String::compose (_("could not move audio asset into the DCP (%1)"), ec.value ()), audio_asset_filename (_sound_asset)
+                               String::compose (_("could not move audio asset into the DCP (%1)"), ec.value ()), aaf
                                );
                }
 
index 9dc7401710fe39d857e7da1ac176169c8eaf69a9..a80f51dc255c814311ca9d4356e15cba24b5bc95 100644 (file)
@@ -47,7 +47,7 @@ namespace dcp {
 class ReelWriter
 {
 public:
-       ReelWriter (boost::shared_ptr<const Film> film, DCPTimePeriod period, boost::shared_ptr<Job> job);
+       ReelWriter (boost::shared_ptr<const Film> film, DCPTimePeriod period, boost::shared_ptr<Job> job, int reel_index, int reel_count);
 
        void write (boost::optional<dcp::Data> encoded, Frame frame, Eyes eyes);
        void fake_write (Frame frame, Eyes eyes, int size);
@@ -102,6 +102,10 @@ private:
        Eyes _last_written_eyes;
        /** the number of audio frames that have been written to the reel */
        int _total_written_audio_frames;
+       /** index of this reel within the DCP (starting from 0) */
+       int _reel_index;
+       /** number of reels in the DCP */
+       int _reel_count;
 
        boost::shared_ptr<dcp::PictureAsset> _picture_asset;
        boost::shared_ptr<dcp::PictureAssetWriter> _picture_asset_writer;
index 59974c24c07bd33803923ee1cdef27e3c7ee207d..c8d0561bec1e19600b4b2535db98d8e27010edd2 100644 (file)
@@ -617,20 +617,24 @@ split_get_request (string url)
 }
 
 string
-video_asset_filename (shared_ptr<dcp::PictureAsset> asset)
+video_asset_filename (shared_ptr<dcp::PictureAsset> asset, int reel_index, int reel_count)
 {
        dcp::NameFormat::Map values;
        values['t'] = "j2c";
        values['i'] = asset->id();
+       values['r'] = raw_convert<string> (reel_index + 1);
+       values['n'] = raw_convert<string> (reel_count);
        return Config::instance()->dcp_filename_format().get(values) + ".mxf";
 }
 
 string
-audio_asset_filename (shared_ptr<dcp::SoundAsset> asset)
+audio_asset_filename (shared_ptr<dcp::SoundAsset> asset, int reel_index, int reel_count)
 {
        dcp::NameFormat::Map values;
        values['t'] = "pcm";
        values['i'] = asset->id();
+       values['r'] = raw_convert<string> (reel_index + 1);
+       values['n'] = raw_convert<string> (reel_count);
        return Config::instance()->dcp_filename_format().get(values) + ".mxf";
 }
 
index c94d0fc9f4a97e3cda6cf47e9827e76ea9d05b0a..b3621bb1304edf52ae7e8fafab1d8367152d3b22 100644 (file)
@@ -74,8 +74,8 @@ extern int stride_round_up (int, int const *, int);
 extern void* wrapped_av_malloc (size_t);
 extern void set_backtrace_file (boost::filesystem::path);
 extern std::map<std::string, std::string> split_get_request (std::string url);
-extern std::string video_asset_filename (boost::shared_ptr<dcp::PictureAsset> asset);
-extern std::string audio_asset_filename (boost::shared_ptr<dcp::SoundAsset> asset);
+extern std::string video_asset_filename (boost::shared_ptr<dcp::PictureAsset> asset, int reel_index, int reel_count);
+extern std::string audio_asset_filename (boost::shared_ptr<dcp::SoundAsset> asset, int reel_index, int reel_count);
 extern float relaxed_string_to_float (std::string);
 extern bool string_not_empty (std::string);
 
index 00dfcdcbe9319c4022379866ed1d4de021ac1621..9aee7d92f3099fcd4727d8d1245f55d4173c5b10 100644 (file)
@@ -84,8 +84,10 @@ Writer::Writer (shared_ptr<const Film> film, weak_ptr<Job> j)
        shared_ptr<Job> job = _job.lock ();
        DCPOMATIC_ASSERT (job);
 
-       BOOST_FOREACH (DCPTimePeriod p, _film->reels ()) {
-               _reels.push_back (ReelWriter (film, p, job));
+       int reel_index = 0;
+       list<DCPTimePeriod> const reels = _film->reels ();
+       BOOST_FOREACH (DCPTimePeriod p, reels) {
+               _reels.push_back (ReelWriter (film, p, job, reel_index++, reels.size()));
        }
 
        /* We can keep track of the current audio and subtitle reels easily because audio
index a68f4576dc69f50a5955f64ed1e94bdf8c8383fd..10ee7c79a275face2b8b3f5f5186b627d8bccfc3 100644 (file)
@@ -1413,9 +1413,13 @@ private:
                dcp::NameFormat::Map titles;
                titles['t'] = "type (j2c/pcm/sub/cpl/pkl)";
                titles['i'] = "unique ID";
+               titles['r'] = "reel number";
+               titles['n'] = "number of reels";
                dcp::NameFormat::Map examples;
                examples['t'] = "j2c";
                examples['i'] = "eb1c112c-ca3c-4ae6-9263-c6714ff05d64";
+               examples['r'] = "1";
+               examples['n'] = "4";
                _dcp_filename_format = new NameFormatEditor<dcp::FilenameFormat> (_panel, Config::instance()->dcp_filename_format(), titles, examples);
                table->Add (_dcp_filename_format->panel(), 1, wxEXPAND | wxALL);
 
index 0f46821274a092c8b40468da581dc0b8000a0f6c..71295807fda83b7be874448e172494f32b02d1a5 100644 (file)
@@ -83,7 +83,7 @@ private:
                wxString example = wxString::Format (_("e.g. %s"), _name.get (_examples));
                wxString wrapped;
                for (size_t i = 0; i < example.Length(); ++i) {
-                       if (i > 0 && (i % 30) == 0) {
+                       if (i > 0 && (i % 40) == 0) {
                                wrapped += "\n";
                        }
                        wrapped += example[i];