X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fanalyse_subtitles_job.cc;h=d8d258ea54962af1d86c198242302690744feecb;hp=0b003427c54115af0b6771017c410af5b12d52d4;hb=a32ac8ffe3f061cee5396364cf73ce565c130f3a;hpb=689fa55d1529ad88449ca464e9107c4dcc54d1cb diff --git a/src/lib/analyse_subtitles_job.cc b/src/lib/analyse_subtitles_job.cc index 0b003427c..d8d258ea5 100644 --- a/src/lib/analyse_subtitles_job.cc +++ b/src/lib/analyse_subtitles_job.cc @@ -80,7 +80,9 @@ AnalyseSubtitlesJob::run () set_progress_unknown (); if (!content->text.empty()) { - while (!player->pass ()) {} + while (!player->pass ()) { + boost::this_thread::interruption_point(); + } } SubtitleAnalysis analysis (_bounding_box, content->text.front()->x_offset(), content->text.front()->y_offset()); @@ -92,7 +94,7 @@ AnalyseSubtitlesJob::run () void -AnalyseSubtitlesJob::analyse (PlayerText text, TextType type) +AnalyseSubtitlesJob::analyse(PlayerText const& text, TextType type) { if (type != TextType::OPEN_SUBTITLE) { return; @@ -106,14 +108,34 @@ AnalyseSubtitlesJob::analyse (PlayerText text, TextType type) } } - if (!text.string.empty()) { - /* We can provide dummy values for time and frame rate here as they are only used to calculate fades */ - dcp::Size const frame = _film->frame_size(); - for (auto i: render_text(text.string, text.fonts, frame, dcpomatic::DCPTime(), 24)) { + if (text.string.empty()) { + return; + } + + /* We can provide dummy values for time and frame rate here as they are only used to calculate fades */ + dcp::Size const frame = _film->frame_size(); + std::vector override_standard; + if (_film->interop()) { + /* Since the film is Interop there is only one way the vpositions in the subs can be interpreted + * (we assume). + */ + override_standard.push_back(dcp::SubtitleStandard::INTEROP); + } else { + /* We're using the great new SMPTE standard, which means there are two different ways that vposition + * could be interpreted; we will write SMPTE-2014 standard assets, but if the projection system uses + * SMPTE 20{07,10} instead they won't be placed how we intended. To show the user this, make the + * bounding rectangle enclose both possibilities. + */ + override_standard.push_back(dcp::SubtitleStandard::SMPTE_2007); + override_standard.push_back(dcp::SubtitleStandard::SMPTE_2014); + } + + for (auto standard: override_standard) { + for (auto i: bounding_box(text.string, frame, standard)) { dcpomatic::Rect rect ( - double(i.position.x) / frame.width, double(i.position.y) / frame.height, - double(i.image->size().width) / frame.width, double(i.image->size().height) / frame.height - ); + double(i.x) / frame.width, double(i.y) / frame.height, + double(i.width) / frame.width, double(i.height) / frame.height + ); if (!_bounding_box) { _bounding_box = rect; } else {