X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Freel_writer.cc;h=cd6a1a4b9d54c51d8d360dc3eae3c0823c15bc4e;hb=cc99556229bf35506c20377f4550665af6f5594a;hp=2d88d71620de995cf326cc2a6f0f4b2bd7f87d86;hpb=43f83b3508829b9d773be69db4b010ac91f101b7;p=dcpomatic.git diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 2d88d7162..cd6a1a4b9 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -32,24 +32,26 @@ #include "image.h" #include #include +#include +#include +#include +#include #include -#include -#include -#include +#include #include #include +#include +#include +#include #include -#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include #include #include "i18n.h" @@ -438,8 +440,8 @@ ReelWriter::finish (boost::filesystem::path output_dcp) } } -template -shared_ptr +template +shared_ptr maybe_add_text ( shared_ptr asset, int64_t picture_duration, @@ -455,7 +457,7 @@ maybe_add_text ( { Frame const period_duration = period.duration().frames_round(film->video_frame_rate()); - shared_ptr reel_asset; + shared_ptr reel_asset; if (asset) { /* Add the font to the subtitle content */ @@ -463,33 +465,38 @@ maybe_add_text ( asset->add_font (j.id, j.data.get_value_or(default_font)); } - if (dynamic_pointer_cast (asset)) { - auto directory = output_dcp / asset->id (); + if (auto interop = dynamic_pointer_cast(asset)) { + auto directory = output_dcp / interop->id (); boost::filesystem::create_directories (directory); - asset->write (directory / ("sub_" + asset->id() + ".xml")); - } else { + interop->write (directory / ("sub_" + interop->id() + ".xml")); + reel_asset = make_shared ( + interop, + dcp::Fraction(film->video_frame_rate(), 1), + picture_duration, + 0 + ); + } else if (auto smpte = dynamic_pointer_cast(asset)) { /* All our assets should be the same length; use the picture asset length here as a reference to set the subtitle one. We'll use the duration rather than the intrinsic duration; we don't care if the picture asset has been trimmed, we're just interested in its presentation length. */ - dynamic_pointer_cast(asset)->set_intrinsic_duration (picture_duration); - - asset->write ( + smpte->set_intrinsic_duration(picture_duration); + smpte->write ( output_dcp / ("sub_" + asset->id() + ".mxf") ); + reel_asset = make_shared ( + smpte, + dcp::Fraction(film->video_frame_rate(), 1), + picture_duration, + 0 + ); } - reel_asset = make_shared ( - asset, - dcp::Fraction(film->video_frame_rate(), 1), - picture_duration, - 0 - ); } else { /* We don't have a subtitle asset of our own; hopefully we have one to reference */ for (auto j: refs) { - auto k = dynamic_pointer_cast (j.asset); + auto k = dynamic_pointer_cast (j.asset); if (k && j.period == period) { reel_asset = k; /* If we have a hash for this asset in the CPL, assume that it is correct */ @@ -622,7 +629,7 @@ ReelWriter::create_reel_text ( set ensure_closed_captions ) const { - auto subtitle = maybe_add_text ( + auto subtitle = maybe_add_text ( _subtitle_asset, duration, reel, refs, fonts, _default_font, film(), _period, output_dcp, _text_only ); @@ -633,7 +640,7 @@ ReelWriter::create_reel_text ( } } else if (ensure_subtitles) { /* We had no subtitle asset, but we've been asked to make sure there is one */ - subtitle = maybe_add_text( + subtitle = maybe_add_text ( empty_text_asset(TextType::OPEN_SUBTITLE, optional()), duration, reel, @@ -648,7 +655,7 @@ ReelWriter::create_reel_text ( } for (auto const& i: _closed_caption_assets) { - auto a = maybe_add_text ( + auto a = maybe_add_text ( i.second, duration, reel, refs, fonts, _default_font, film(), _period, output_dcp, _text_only ); DCPOMATIC_ASSERT (a); @@ -662,7 +669,7 @@ ReelWriter::create_reel_text ( /* Make empty tracks for anything we've been asked to ensure but that we haven't added */ for (auto i: ensure_closed_captions) { - auto a = maybe_add_text ( + auto a = maybe_add_text ( empty_text_asset(TextType::CLOSED_CAPTION, i), duration, reel, refs, fonts, _default_font, film(), _period, output_dcp, _text_only ); DCPOMATIC_ASSERT (a);