Check for long CCAP lines and too many CCAP lines.
authorCarl Hetherington <cth@carlh.net>
Fri, 27 Jul 2018 14:19:30 +0000 (15:19 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 27 Jul 2018 14:19:30 +0000 (15:19 +0100)
src/lib/hints.cc
src/lib/hints.h
src/lib/util.h
src/wx/closed_captions_dialog.cc
src/wx/closed_captions_dialog.h

index 77b10da15af85655c667f178e12d701a2f1fde2a..e11312eb03fa7a37d048484b539f7acbed7a613a 100644 (file)
@@ -54,6 +54,8 @@ Hints::Hints (weak_ptr<const Film> film)
        : _film (film)
        , _thread (0)
        , _long_ccap (false)
+       , _overlap_ccap (false)
+       , _too_many_ccap_lines (false)
 {
 
 }
@@ -84,6 +86,8 @@ Hints::start ()
 {
        stop_thread ();
        _long_ccap = false;
+       _overlap_ccap = false;
+       _too_many_ccap_lines = false;
        _thread = new boost::thread (bind(&Hints::thread, this));
 }
 
@@ -283,10 +287,26 @@ Hints::text (PlayerText text, TextType type, DCPTimePeriod period)
                return;
        }
 
+       int lines = text.text.size();
        BOOST_FOREACH (StringText i, text.text) {
-               if (!_long_ccap && i.text().length() > 30) {
-                       _long_ccap = true;
-                       hint (_("Some of your closed captions have lines longer than 30 characters, so they will probably be word-wrapped."));
+               if (i.text().length() > CLOSED_CAPTION_LENGTH) {
+                       ++lines;
+                       if (!_long_ccap) {
+                               _long_ccap = true;
+                               hint (String::compose(_("Some of your closed captions have lines longer than %1 characters, so they will probably be word-wrapped."), CLOSED_CAPTION_LENGTH));
+                       }
                }
        }
+
+       if (!_too_many_ccap_lines && lines > CLOSED_CAPTION_LINES) {
+               hint (String::compose(_("Some of your closed captions span more than %1 lines, so they will be truncated."), CLOSED_CAPTION_LINES));
+               _too_many_ccap_lines = true;
+       }
+
+       if (!_overlap_ccap && _last && _last->overlap(period)) {
+               _overlap_ccap = true;
+               hint (_("You have overlapping closed captions, which is not allowed."));
+       }
+
+       _last = period;
 }
index ad66fb472a6a375137784bcfb0266cf954fb4bc5..6ee398c88c12d6edb77013ab1b8174eb54d1bdc2 100644 (file)
@@ -52,4 +52,7 @@ private:
        boost::thread* _thread;
 
        bool _long_ccap;
+       bool _overlap_ccap;
+       bool _too_many_ccap_lines;
+       boost::optional<DCPTimePeriod> _last;
 };
index 5ca198ebbcc8f61b46a4ebb6bb2cc5678cf6cb1b..d6fddcddafb7eac2b79422a49d1769da96260539 100644 (file)
@@ -57,6 +57,10 @@ namespace dcp {
 #define TEXT_FONT_ID "font"
 /** Largest KDM size (in bytes) that will be accepted */
 #define MAX_KDM_SIZE (256 * 1024)
+/** Number of lines that closed caption viewers will display */
+#define CLOSED_CAPTION_LINES 3
+/** Maximum line length of closed caption viewers */
+#define CLOSED_CAPTION_LENGTH 30
 
 extern std::string program_name;
 extern bool is_batch_converter;
index 1e13f867a4dae952cb16c069fedb33f067834cce..ea7db88f02375ffb17bf29f993ece7f9038cf005 100644 (file)
@@ -29,9 +29,6 @@ using std::make_pair;
 using boost::shared_ptr;
 using boost::weak_ptr;
 
-int const ClosedCaptionsDialog::_num_lines = 3;
-int const ClosedCaptionsDialog::_num_chars_per_line = 30;
-
 ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent)
        : wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxDefaultSize,
 #ifdef DCPOMATIC_OSX
@@ -45,7 +42,7 @@ ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent)
                )
 
 {
-       _lines.resize (_num_lines);
+       _lines.resize (CLOSED_CAPTION_LINES);
        Bind (wxEVT_PAINT, boost::bind (&ClosedCaptionsDialog::paint, this));
 }
 
@@ -58,16 +55,16 @@ ClosedCaptionsDialog::paint ()
        dc.SetTextForeground (*wxWHITE);
 
        /* Choose a font which fits vertically */
-       int const line_height = max (8, dc.GetSize().GetHeight() / _num_lines);
+       int const line_height = max (8, dc.GetSize().GetHeight() / CLOSED_CAPTION_LINES);
        wxFont font (*wxNORMAL_FONT);
        font.SetPixelSize (wxSize (0, line_height * 0.8));
        dc.SetFont (font);
 
-       for (int i = 0; i < _num_lines; ++i) {
-               wxString const good = _lines[i].Left (_num_chars_per_line);
+       for (int i = 0; i < CLOSED_CAPTION_LINES; ++i) {
+               wxString const good = _lines[i].Left (CLOSED_CAPTION_LENGTH);
                dc.DrawText (good, 8, line_height * i);
-               if (_lines[i].Length() > _num_chars_per_line) {
-                       wxString const bad = _lines[i].Right (_lines[i].Length() - _num_chars_per_line);
+               if (_lines[i].Length() > CLOSED_CAPTION_LENGTH) {
+                       wxString const bad = _lines[i].Right (_lines[i].Length() - CLOSED_CAPTION_LENGTH);
                        wxSize size = dc.GetTextExtent (good);
                        dc.SetTextForeground (*wxRED);
                        dc.DrawText (bad, 8 + size.GetWidth(), line_height * i);
@@ -112,7 +109,7 @@ ClosedCaptionsDialog::update (DCPTime time)
                }
        }
 
-       for (int j = 0; j < _num_lines; ++j) {
+       for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) {
                _lines[j] = "";
        }
 
@@ -120,7 +117,7 @@ ClosedCaptionsDialog::update (DCPTime time)
 
        list<StringText>::const_iterator j = to_show.begin();
        int k = 0;
-       while (j != to_show.end() && k < _num_lines) {
+       while (j != to_show.end() && k < CLOSED_CAPTION_LINES) {
                _lines[k] = j->text();
                ++j;
                ++k;
index a599bc7036f8d048bb421a64fe30a9e974a506d8..be5b3664d4fb3c25e836d34c3b8f4b691c7ca32b 100644 (file)
@@ -38,6 +38,4 @@ private:
 
        std::vector<wxString> _lines;
        boost::weak_ptr<Player> _player;
-       static int const _num_lines;
-       static int const _num_chars_per_line;
 };