From: Carl Hetherington Date: Thu, 3 Jun 2021 19:08:37 +0000 (+0200) Subject: Fix line numbers in binary STL files. X-Git-Tag: v1.6.0~6 X-Git-Url: https://git.carlh.net/gitweb/?p=libsub.git;a=commitdiff_plain;h=f3d7335ca4229a520f78906277693451cef8dce7 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. --- 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 diff --git a/test/stl_binary_reader_test.cc b/test/stl_binary_reader_test.cc index cf97b5a..6566c5f 100644 --- a/test/stl_binary_reader_test.cc +++ b/test/stl_binary_reader_test.cc @@ -70,15 +70,27 @@ BOOST_AUTO_TEST_CASE (stl_binary_reader_test2) } -/** Test reading a file which raised "Unknown language group code U8" */ +/** Test reading a file which raised "Unknown language group code U8" and which has + * bizarre line numbering. + */ BOOST_AUTO_TEST_CASE (stl_binary_reader_test3) { if (private_test.empty()) { return; } + /* This file has a MNR value of 99, which (as per the spec recommendation) + * we "fix" to 12. But it also has line numbers which start at 99 and go up from there, + * so if we don't also alter the line numbers they end up way off the bottom of the screen. + * Check that the line numbers are brought into the range of our "fix". + */ + auto path = private_test / "hsk.stl"; ifstream in (path.string().c_str()); auto reader = make_shared(in); + for (auto i: reader->subtitles()) { + BOOST_REQUIRE(*i.vertical_position.line >= 0); + BOOST_REQUIRE(*i.vertical_position.line <= 12); + } }