summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-07-27 15:19:30 +0100
committerCarl Hetherington <cth@carlh.net>2018-07-27 15:19:30 +0100
commit4843bf7b6820fe9f027699cf30c41804e714fbac (patch)
tree443970dc9b7a865b4b8130ba5115d28f00ad8b54 /src
parentc8b10d5eac6006b62d2a7add9da0c6206b72899b (diff)
Check for long CCAP lines and too many CCAP lines.
Diffstat (limited to 'src')
-rw-r--r--src/lib/hints.cc26
-rw-r--r--src/lib/hints.h3
-rw-r--r--src/lib/util.h4
-rw-r--r--src/wx/closed_captions_dialog.cc19
-rw-r--r--src/wx/closed_captions_dialog.h2
5 files changed, 38 insertions, 16 deletions
diff --git a/src/lib/hints.cc b/src/lib/hints.cc
index 77b10da15..e11312eb0 100644
--- a/src/lib/hints.cc
+++ b/src/lib/hints.cc
@@ -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;
}
diff --git a/src/lib/hints.h b/src/lib/hints.h
index ad66fb472..6ee398c88 100644
--- a/src/lib/hints.h
+++ b/src/lib/hints.h
@@ -52,4 +52,7 @@ private:
boost::thread* _thread;
bool _long_ccap;
+ bool _overlap_ccap;
+ bool _too_many_ccap_lines;
+ boost::optional<DCPTimePeriod> _last;
};
diff --git a/src/lib/util.h b/src/lib/util.h
index 5ca198ebb..d6fddcdda 100644
--- a/src/lib/util.h
+++ b/src/lib/util.h
@@ -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;
diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc
index 1e13f867a..ea7db88f0 100644
--- a/src/wx/closed_captions_dialog.cc
+++ b/src/wx/closed_captions_dialog.cc
@@ -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;
diff --git a/src/wx/closed_captions_dialog.h b/src/wx/closed_captions_dialog.h
index a599bc703..be5b3664d 100644
--- a/src/wx/closed_captions_dialog.h
+++ b/src/wx/closed_captions_dialog.h
@@ -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;
};