From a41e19f6cb77126ea5301b71cf51b306b339ebd2 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 21 Jan 2023 23:18:22 +0100 Subject: [PATCH] Show possible subtitle bounding boxes due to SMPTE standard misunderstandings. --- src/lib/analyse_subtitles_job.cc | 36 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/lib/analyse_subtitles_job.cc b/src/lib/analyse_subtitles_job.cc index f140f13d1..b41b65c3b 100644 --- a/src/lib/analyse_subtitles_job.cc +++ b/src/lib/analyse_subtitles_job.cc @@ -112,15 +112,33 @@ AnalyseSubtitlesJob::analyse(PlayerText const& text, TextType type) /* 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: bounding_box(text.string, frame)) { - dcpomatic::Rect rect ( - 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 { - _bounding_box->extend (rect); + 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.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 { + _bounding_box->extend (rect); + } } } } -- 2.30.2