From f3d7335ca4229a520f78906277693451cef8dce7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 3 Jun 2021 21:08:37 +0200 Subject: Fix line numbers in binary STL files. Here we make sure that line numbers end up not larger than the MNR (maximum number of rows) to try to avoid subtitles going off the screen. --- src/stl_binary_reader.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'src/stl_binary_reader.cc') diff --git a/src/stl_binary_reader.cc b/src/stl_binary_reader.cc index f441aec..35091f0 100644 --- a/src/stl_binary_reader.cc +++ b/src/stl_binary_reader.cc @@ -187,6 +187,7 @@ void STLBinaryReader::read (shared_ptr reader) editor_name = reader->get_string(309, 32); editor_contact_details = reader->get_string(341, 32); + int highest_line = 0; for (int i = 0; i < tti_blocks; ++i) { reader->read (128, "TTI"); @@ -211,10 +212,11 @@ void STLBinaryReader::read (shared_ptr reader) RawSubtitle sub; sub.from = reader->get_timecode(5, frame_rate); sub.to = reader->get_timecode(9, frame_rate); - /* XXX: only the vertical position of the first TTI block should be used (says the spec), - so using reader->get_int(13, 1) here is wrong if i > 0 - */ + /* XXX: vertical position of TTI extension blocks should be ignored (spec page 10) so this + * is wrong if the EBN of this TTI block is not 255 (I think). + */ sub.vertical_position.line = reader->get_int(13, 1) + j; + highest_line = std::max(highest_line, *sub.vertical_position.line); sub.vertical_position.lines = maximum_rows; sub.vertical_position.reference = TOP_OF_SCREEN; sub.italic = italic; @@ -283,6 +285,14 @@ void STLBinaryReader::read (shared_ptr reader) /* XXX: justification */ } } + + /* Fix line numbers so they don't go off the bottom of the screen */ + if (highest_line > maximum_rows) { + int correction = highest_line - maximum_rows; + for (auto& i: _subs) { + *i.vertical_position.line -= correction; + } + } } map -- cgit v1.2.3