diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-12-07 01:18:38 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-12-08 14:09:02 +0100 |
| commit | cadca6e4f8c1d844f1b5fb9375023e627c674fa9 (patch) | |
| tree | b10c0ce91c95a2fd5d9bdb2326fe367905990b15 /src/lib/hints.cc | |
| parent | 46b4349fb5a19523e5105812bf79fd0e7df9c51f (diff) | |
Write subtitles and closed captions to a test DCP in the hints thread,
then check the result for Bv2.1 violations (part of #1800).
Diffstat (limited to 'src/lib/hints.cc')
| -rw-r--r-- | src/lib/hints.cc | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/src/lib/hints.cc b/src/lib/hints.cc index 5c9d3d8a4..131548035 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -33,7 +33,12 @@ #include "util.h" #include "cross.h" #include "player.h" +#include "writer.h" +#include <dcp/cpl.h> #include <dcp/raw_convert.h> +#include <dcp/reel.h> +#include <dcp/reel_closed_caption_asset.h> +#include <dcp/reel_subtitle_asset.h> #include <boost/foreach.hpp> #include <boost/algorithm/string.hpp> #include <iostream> @@ -55,8 +60,16 @@ using namespace dcpomatic; using namespace boost::placeholders; #endif + +/* When checking to see if things are too big, we'll say they are if they + * are more than the target size minus this "slack." + */ +#define SIZE_SLACK 4096 + + Hints::Hints (weak_ptr<const Film> film) : WeakConstFilm (film) + , _writer (new Writer(film, weak_ptr<Job>(), true)) , _long_ccap (false) , _overlap_ccap (false) , _too_many_ccap_lines (false) @@ -226,7 +239,7 @@ Hints::check_big_font_files () BOOST_FOREACH (shared_ptr<TextContent> j, i->text) { BOOST_FOREACH (shared_ptr<Font> k, j->fonts()) { optional<boost::filesystem::path> const p = k->file (); - if (p && boost::filesystem::file_size(p.get()) >= (640 * 1024)) { + if (p && boost::filesystem::file_size(p.get()) >= (MAX_FONT_FILE_SIZE - SIZE_SLACK)) { big_font_files = true; } } @@ -311,6 +324,14 @@ Hints::check_loudness () } +static +bool +subtitle_mxf_too_big (shared_ptr<dcp::SubtitleAsset> asset) +{ + return asset && asset->file() && boost::filesystem::file_size(*asset->file()) >= (MAX_TEXT_MXF_SIZE - SIZE_SLACK); +} + + void Hints::thread () { @@ -339,7 +360,7 @@ Hints::thread () shared_ptr<Player> player (new Player(film)); player->set_ignore_video (); player->set_ignore_audio (); - player->Text.connect (bind(&Hints::text, this, _1, _2, _4)); + player->Text.connect (bind(&Hints::text, this, _1, _2, _3, _4)); struct timeval last_pulse; gettimeofday (&last_pulse, 0); @@ -361,6 +382,45 @@ Hints::thread () store_current (); } + _writer->write (player->get_subtitle_fonts()); + + bool ccap_xml_too_big = false; + bool ccap_mxf_too_big = false; + bool subs_mxf_too_big = false; + + boost::filesystem::path dcp_dir = film->dir("hints") / dcpomatic::get_process_id(); + boost::filesystem::remove_all (dcp_dir); + _writer->finish (film->dir("hints") / dcpomatic::get_process_id()); + dcp::DCP dcp (dcp_dir); + dcp.read (); + DCPOMATIC_ASSERT (dcp.cpls().size() == 1); + BOOST_FOREACH (shared_ptr<dcp::Reel> reel, dcp.cpls().front()->reels()) { + BOOST_FOREACH (shared_ptr<dcp::ReelClosedCaptionAsset> ccap, reel->closed_captions()) { + if (ccap->asset() && ccap->asset()->xml_as_string().length() > static_cast<size_t>(MAX_CLOSED_CAPTION_XML_SIZE - SIZE_SLACK) && !ccap_xml_too_big) { + hint (_( + "At least one of your closed caption files' XML part is larger than " MAX_CLOSED_CAPTION_XML_SIZE_TEXT + ". You should divide the DCP into shorter reels." + )); + ccap_xml_too_big = true; + } + if (subtitle_mxf_too_big(ccap->asset()) && !ccap_mxf_too_big) { + hint (_( + "At least one of your closed caption files is larger than " MAX_TEXT_MXF_SIZE_TEXT + " in total. You should divide the DCP into shorter reels." + )); + ccap_mxf_too_big = true; + } + } + if (reel->main_subtitle() && subtitle_mxf_too_big(reel->main_subtitle()->asset()) && !subs_mxf_too_big) { + hint (_( + "At least one of your subtitle files is larger than " MAX_TEXT_MXF_SIZE_TEXT " in total. " + "You should divide the DCP into shorter reels." + )); + subs_mxf_too_big = true; + } + } + boost::filesystem::remove_all (dcp_dir); + emit (bind(boost::ref(Finished))); } @@ -371,8 +431,10 @@ Hints::hint (string h) } void -Hints::text (PlayerText text, TextType type, DCPTimePeriod period) +Hints::text (PlayerText text, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period) { + _writer->write (text, type, track, period); + switch (type) { case TEXT_CLOSED_CAPTION: closed_caption (text, period); |
