summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-06-03 21:08:37 +0200
committerCarl Hetherington <cth@carlh.net>2021-06-03 21:08:37 +0200
commitf3d7335ca4229a520f78906277693451cef8dce7 (patch)
tree39ff804ab9b9aa7d07e9274c1584ad08e9f04381
parent046ce2e8d22ea384dc7e1e4545bede6fd859d9c3 (diff)
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.
-rw-r--r--src/stl_binary_reader.cc16
-rw-r--r--test/stl_binary_reader_test.cc14
2 files changed, 26 insertions, 4 deletions
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<InputReader> 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<InputReader> 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<InputReader> 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<string, string>
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<sub::STLBinaryReader>(in);
+ for (auto i: reader->subtitles()) {
+ BOOST_REQUIRE(*i.vertical_position.line >= 0);
+ BOOST_REQUIRE(*i.vertical_position.line <= 12);
+ }
}