Make it quicker to cancel an analyse subtitle job (#2486).
[dcpomatic.git] / src / lib / analyse_subtitles_job.cc
index f0dacf36bf0b829c86bce347f560264776b20fe4..d8d258ea54962af1d86c198242302690744feecb 100644 (file)
@@ -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;
@@ -112,15 +114,33 @@ AnalyseSubtitlesJob::analyse (PlayerText 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: render_text(text.string, frame, dcpomatic::DCPTime(), 24)) {
-               dcpomatic::Rect<double> 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
-                       );
-               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);
+                       }
                }
        }
 }