Show possible subtitle bounding boxes due to SMPTE standard misunderstandings.
authorCarl Hetherington <cth@carlh.net>
Sat, 21 Jan 2023 22:18:22 +0000 (23:18 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 27 Feb 2023 13:47:25 +0000 (14:47 +0100)
src/lib/analyse_subtitles_job.cc

index f140f13d1ee514873d98d08b195825f7e7252c3b..b41b65c3ba2872dfdd39290b2671b59bc64eb9ee 100644 (file)
@@ -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<double> 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<dcp::SubtitleStandard> 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<double> 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);
+                       }
                }
        }
 }