Always make 16-channel MXFs.
[dcpomatic.git] / src / lib / reel_writer.cc
index 94b12ec7d38506147541c09d2b99634f82945a6d..9ffe1cdc53f1a2f9f45344cd86bbbaa778cbcd30 100644 (file)
@@ -22,6 +22,7 @@
 #include "audio_buffers.h"
 #include "compose.hpp"
 #include "config.h"
+#include "constants.h"
 #include "cross.h"
 #include "dcpomatic_log.h"
 #include "digester.h"
@@ -161,7 +162,7 @@ ReelWriter::ReelWriter (
                }
 
                _picture_asset->set_file (asset);
-               _picture_asset_writer = _picture_asset->start_write (asset, _first_nonexistent_frame > 0);
+               _picture_asset_writer = _picture_asset->start_write(asset, _first_nonexistent_frame > 0 ? dcp::PictureAsset::Behaviour::OVERWRITE_EXISTING : dcp::PictureAsset::Behaviour::MAKE_NEW);
        } else if (!text_only) {
                /* We already have a complete picture asset that we can just re-use */
                /* XXX: what about if the encryption key changes? */
@@ -177,7 +178,8 @@ ReelWriter::ReelWriter (
                _sound_asset = make_shared<dcp::SoundAsset> (
                        dcp::Fraction(film()->video_frame_rate(), 1),
                        film()->audio_frame_rate(),
-                       film()->audio_channels(),
+                       /* Always make 16-channel sound assets for SMPTE; libdcp will pad unused channels for us */
+                       standard == dcp::Standard::SMPTE ? MAX_DCP_AUDIO_CHANNELS : film()->audio_channels(),
                        lang ? *lang : dcp::LanguageTag("en-US"),
                        standard
                        );
@@ -195,7 +197,9 @@ ReelWriter::ReelWriter (
                */
                _sound_asset_writer = _sound_asset->start_write (
                        film()->directory().get() / audio_asset_filename (_sound_asset, _reel_index, _reel_count, _content_summary),
-                       film()->contains_atmos_content()
+                       film()->audio_channels(),
+                       film()->contains_atmos_content() ? dcp::SoundAsset::AtmosSync::ENABLED : dcp::SoundAsset::AtmosSync::DISABLED,
+                       film()->limit_to_smpte_bv20() ? dcp::SoundAsset::MCASubDescriptors::DISABLED : dcp::SoundAsset::MCASubDescriptors::ENABLED
                        );
        }
 
@@ -820,7 +824,7 @@ ReelWriter::write (shared_ptr<const AudioBuffers> audio)
        }
 
        DCPOMATIC_ASSERT (audio);
-       _sound_asset_writer->write (audio->data(), audio->frames());
+       _sound_asset_writer->write(audio->data(), audio->channels(), audio->frames());
 }
 
 
@@ -856,44 +860,46 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool
                if (film()->encrypted()) {
                        s->set_key (film()->key());
                }
-               if (with_dummy) {
-                       s->add (
-                               std::make_shared<dcp::SubtitleString>(
-                                       optional<std::string>(),
-                                       false,
-                                       false,
-                                       false,
-                                       dcp::Colour(),
-                                       42,
-                                       1.0,
-                                       dcp::Time(0, 0, 0, 0, 24),
-                                       dcp::Time(0, 0, 1, 0, 24),
-                                       0.5,
-                                       dcp::HAlign::CENTER,
-                                       0.5,
-                                       dcp::VAlign::CENTER,
-                                       0,
-                                       dcp::Direction::LTR,
-                                       " ",
-                                       dcp::Effect::NONE,
-                                       dcp::Colour(),
-                                       dcp::Time(),
-                                       dcp::Time(),
-                                       0
-                                       )
-                              );
-               }
                asset = s;
        }
 
+       if (with_dummy) {
+               asset->add(
+                       std::make_shared<dcp::SubtitleString>(
+                               optional<std::string>(),
+                               false,
+                               false,
+                               false,
+                               dcp::Colour(),
+                               42,
+                               1.0,
+                               dcp::Time(0, 0, 0, 0, 24),
+                               dcp::Time(0, 0, 1, 0, 24),
+                               0.5,
+                               dcp::HAlign::CENTER,
+                               0.5,
+                               dcp::VAlign::CENTER,
+                               0,
+                               dcp::Direction::LTR,
+                               " ",
+                               dcp::Effect::NONE,
+                               dcp::Colour(),
+                               dcp::Time(),
+                               dcp::Time(),
+                               0
+                               )
+                      );
+       }
+
        return asset;
 }
 
 
 float
-ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::Standard to) const
+ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::SubtitleStandard to) const
 {
-       if (subtitle.valign_standard == to) {
+       if (dcp::uses_baseline(subtitle.valign_standard) == dcp::uses_baseline(to)) {
+               /* The from and to standards use the same alignment reference */
                return subtitle.v_position();
        }
 
@@ -913,7 +919,7 @@ ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::Standard
                break;
        }
 
-       return subtitle.v_position() + ((subtitle.valign_standard == dcp::Standard::SMPTE) ? correction : -correction);
+       return subtitle.v_position() + (dcp::uses_bounding_box(subtitle.valign_standard) ? correction : -correction);
 }
 
 
@@ -956,7 +962,7 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track,
        for (auto i: subs.string) {
                i.set_in  (dcp::Time(period.from.seconds() - _period.from.seconds(), tcr));
                i.set_out (dcp::Time(period.to.seconds() - _period.from.seconds(), tcr));
-               i.set_v_position(convert_vertical_position(i, film()->interop() ? dcp::Standard::INTEROP : dcp::Standard::SMPTE));
+               i.set_v_position(convert_vertical_position(i, film()->interop() ? dcp::SubtitleStandard::INTEROP : dcp::SubtitleStandard::SMPTE_2014));
                auto sub = make_shared<dcp::SubtitleString>(i);
                if (type == TextType::OPEN_SUBTITLE) {
                        sub->set_font(fonts.get(i.font));