Allow more complete control over the libdcp/DCP-o-matic metadata written to various...
[dcpomatic.git] / src / lib / reel_writer.cc
index 116761dab857b269528fb1b7f558ec1abc587964..3697fc7b147472992d1e00470ece76735994f637 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -27,6 +27,7 @@
 #include "digester.h"
 #include "font.h"
 #include "compose.hpp"
+#include "config.h"
 #include "audio_buffers.h"
 #include "image.h"
 #include <dcp/mono_picture_asset.h>
@@ -65,14 +66,29 @@ using namespace dcpomatic;
 
 int const ReelWriter::_info_size = 48;
 
+static dcp::MXFMetadata
+mxf_metadata ()
+{
+       dcp::MXFMetadata meta;
+       Config* config = Config::instance();
+       if (!config->dcp_company_name().empty()) {
+               meta.company_name = config->dcp_company_name ();
+       }
+       if (!config->dcp_product_name().empty()) {
+               meta.product_name = config->dcp_product_name ();
+       }
+       if (!config->dcp_product_version().empty()) {
+               meta.product_version = config->dcp_product_version ();
+       }
+       return meta;
+}
+
 /** @param job Related job, or 0 */
 ReelWriter::ReelWriter (
        shared_ptr<const Film> film, DCPTimePeriod period, shared_ptr<Job> job, int reel_index, int reel_count, optional<string> content_summary
        )
        : _film (film)
        , _period (period)
-       , _last_written_video_frame (-1)
-       , _last_written_eyes (EYES_RIGHT)
        , _reel_index (reel_index)
        , _reel_count (reel_count)
        , _content_summary (content_summary)
@@ -115,6 +131,7 @@ ReelWriter::ReelWriter (
                }
 
                _picture_asset->set_size (_film->frame_size());
+               _picture_asset->set_metadata (mxf_metadata());
 
                if (_film->encrypted ()) {
                        _picture_asset->set_key (_film->key());
@@ -138,6 +155,8 @@ ReelWriter::ReelWriter (
                        new dcp::SoundAsset (dcp::Fraction (_film->video_frame_rate(), 1), _film->audio_frame_rate (), _film->audio_channels (), standard)
                        );
 
+               _sound_asset->set_metadata (mxf_metadata());
+
                if (_film->encrypted ()) {
                        _sound_asset->set_key (_film->key ());
                }
@@ -266,12 +285,10 @@ ReelWriter::write (optional<Data> encoded, Frame frame, Eyes eyes)
        dcp::FrameInfo fin = _picture_asset_writer->write (encoded->data().get (), encoded->size());
        write_frame_info (frame, eyes, fin);
        _last_written[eyes] = encoded;
-       _last_written_video_frame = frame;
-       _last_written_eyes = eyes;
 }
 
 void
-ReelWriter::fake_write (Frame frame, Eyes eyes, int size)
+ReelWriter::fake_write (int size)
 {
        if (!_picture_asset_writer) {
                /* We're not writing any data */
@@ -279,8 +296,6 @@ ReelWriter::fake_write (Frame frame, Eyes eyes, int size)
        }
 
        _picture_asset_writer->fake_write (size);
-       _last_written_video_frame = frame;
-       _last_written_eyes = eyes;
 }
 
 void
@@ -296,8 +311,6 @@ ReelWriter::repeat_write (Frame frame, Eyes eyes)
                _last_written[eyes]->size()
                );
        write_frame_info (frame, eyes, fin);
-       _last_written_video_frame = frame;
-       _last_written_eyes = eyes;
 }
 
 void
@@ -462,6 +475,8 @@ maybe_add_text (
 shared_ptr<dcp::Reel>
 ReelWriter::create_reel (list<ReferencedReelAsset> const & refs, list<shared_ptr<Font> > const & fonts)
 {
+       LOG_GENERAL ("create_reel for %1-%2; %3 of %4", _period.from.get(), _period.to.get(), _reel_index, _reel_count);
+
        shared_ptr<dcp::Reel> reel (new dcp::Reel ());
 
        shared_ptr<dcp::ReelPictureAsset> reel_picture_asset;
@@ -491,8 +506,6 @@ ReelWriter::create_reel (list<ReferencedReelAsset> const & refs, list<shared_ptr
                }
        }
 
-       LOG_GENERAL ("create_reel for %1-%2; %3 of %4", _period.from.get(), _period.to.get(), _reel_index, _reel_count);
-
        Frame const period_duration = _period.duration().frames_round(_film->video_frame_rate());
 
        DCPOMATIC_ASSERT (reel_picture_asset);
@@ -515,9 +528,13 @@ ReelWriter::create_reel (list<ReferencedReelAsset> const & refs, list<shared_ptr
                /* We have made a sound asset of our own.  Put it into the reel */
                reel_sound_asset.reset (new dcp::ReelSoundAsset (_sound_asset, 0));
        } else {
+               LOG_GENERAL ("no sound asset of our own; look through %1", refs.size());
                /* We don't have a sound asset of our own; hopefully we have one to reference */
                BOOST_FOREACH (ReferencedReelAsset j, refs) {
                        shared_ptr<dcp::ReelSoundAsset> k = dynamic_pointer_cast<dcp::ReelSoundAsset> (j.asset);
+                       if (k) {
+                               LOG_GENERAL ("candidate sound asset period is %1-%2", j.period.from.get(), j.period.to.get());
+                       }
                        if (k && j.period == _period) {
                                reel_sound_asset = k;
                                /* If we have a hash for this asset in the CPL, assume that it is correct */
@@ -638,6 +655,7 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track,
                } else {
                        shared_ptr<dcp::SMPTESubtitleAsset> s (new dcp::SMPTESubtitleAsset ());
                        s->set_content_title_text (_film->name ());
+                       s->set_metadata (mxf_metadata());
                        if (type == TEXT_OPEN_SUBTITLE && !lang.empty()) {
                                s->set_language (lang);
                        } else {