X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Freel_writer.cc;h=350120d9d1ceebe61576204b615224e8a59d8316;hb=ad1ef39eda58b3a919ea3b7084401a0439409ec6;hp=7f5572c36469ba3bafb0e4bad7709d239bde57d3;hpb=df17bbd25da69fc38eb2dcd8b4a2531cf0bab0bc;p=dcpomatic.git diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 7f5572c36..350120d9d 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -23,6 +23,7 @@ #include "cross.h" #include "job.h" #include "log.h" +#include "dcpomatic_log.h" #include "digester.h" #include "font.h" #include "compose.hpp" @@ -49,14 +50,10 @@ #include "i18n.h" -#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); -#define LOG_GENERAL_NC(...) _film->log()->log (__VA_ARGS__, LogEntry::TYPE_GENERAL); -#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, LogEntry::TYPE_WARNING); -#define LOG_ERROR(...) _film->log()->log (String::compose (__VA_ARGS__), LogEntry::TYPE_ERROR); - using std::list; using std::string; using std::cout; +using std::map; using boost::shared_ptr; using boost::optional; using boost::dynamic_pointer_cast; @@ -334,8 +331,8 @@ ReelWriter::finish () } template -void -maybe_add_captions ( +shared_ptr +maybe_add_text ( shared_ptr asset, int64_t picture_duration, shared_ptr reel, @@ -350,7 +347,6 @@ maybe_add_captions ( shared_ptr reel_asset; if (asset) { - boost::filesystem::path liberation_normal; try { liberation_normal = shared_path() / "LiberationSans-Regular.ttf"; @@ -376,7 +372,6 @@ maybe_add_captions ( boost::filesystem::create_directories (directory); asset->write (directory / ("sub_" + asset->id() + ".xml")); } else { - /* 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 @@ -420,6 +415,8 @@ maybe_add_captions ( } reel->add (reel_asset); } + + return reel_asset; } shared_ptr @@ -508,8 +505,14 @@ ReelWriter::create_reel (list const & refs, listadd (reel_sound_asset); - maybe_add_captions (_caption_asset[CAPTION_OPEN], reel_picture_asset->duration(), reel, refs, fonts, _film, _period); - maybe_add_captions (_caption_asset[CAPTION_CLOSED], reel_picture_asset->duration(), reel, refs, fonts, _film, _period); + maybe_add_text (_subtitle_asset, reel_picture_asset->duration(), reel, refs, fonts, _film, _period); + for (map >::const_iterator i = _closed_caption_assets.begin(); i != _closed_caption_assets.end(); ++i) { + shared_ptr a = maybe_add_text ( + i->second, reel_picture_asset->duration(), reel, refs, fonts, _film, _period + ); + a->set_annotation_text (i->first.name); + a->set_language (i->first.language); + } return reel; } @@ -545,9 +548,23 @@ ReelWriter::write (shared_ptr audio) } void -ReelWriter::write (PlayerText subs, TextType type, DCPTimePeriod period) +ReelWriter::write (PlayerText subs, TextType type, optional track, DCPTimePeriod period) { - if (!_caption_asset[type]) { + shared_ptr asset; + + switch (type) { + case TEXT_OPEN_SUBTITLE: + asset = _subtitle_asset; + break; + case TEXT_CLOSED_CAPTION: + DCPOMATIC_ASSERT (track); + asset = _closed_caption_assets[*track]; + break; + default: + DCPOMATIC_ASSERT (false); + } + + if (!asset) { string lang = _film->subtitle_language (); if (lang.empty ()) { lang = "Unknown"; @@ -557,7 +574,7 @@ ReelWriter::write (PlayerText subs, TextType type, DCPTimePeriod period) s->set_movie_title (_film->name ()); s->set_language (lang); s->set_reel_number (raw_convert (_reel_index + 1)); - _caption_asset[type] = s; + asset = s; } else { shared_ptr s (new dcp::SMPTESubtitleAsset ()); s->set_content_title_text (_film->name ()); @@ -569,19 +586,31 @@ ReelWriter::write (PlayerText subs, TextType type, DCPTimePeriod period) if (_film->encrypted ()) { s->set_key (_film->key ()); } - _caption_asset[type] = s; + asset = s; } } - BOOST_FOREACH (StringText i, subs.text) { + switch (type) { + case TEXT_OPEN_SUBTITLE: + _subtitle_asset = asset; + break; + case TEXT_CLOSED_CAPTION: + DCPOMATIC_ASSERT (track); + _closed_caption_assets[*track] = asset; + break; + default: + DCPOMATIC_ASSERT (false); + } + + BOOST_FOREACH (StringText i, subs.string) { /* XXX: couldn't / shouldn't we use period here rather than getting time from the subtitle? */ i.set_in (i.in() - dcp::Time (_period.from.seconds(), i.in().tcr)); i.set_out (i.out() - dcp::Time (_period.from.seconds(), i.out().tcr)); - _caption_asset[type]->add (shared_ptr(new dcp::SubtitleString(i))); + asset->add (shared_ptr(new dcp::SubtitleString(i))); } - BOOST_FOREACH (BitmapText i, subs.image) { - _caption_asset[type]->add ( + BOOST_FOREACH (BitmapText i, subs.bitmap) { + asset->add ( shared_ptr( new dcp::SubtitleImage( i.image->as_png(),