From ff8c5e660a4474fa4b790ad676d868c7260d9809 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 5 Dec 2024 00:53:34 +0100 Subject: Fix decoding of SSA subs in files decoded by FFmpeg (#2904). Suddenly we have 8 commas, not 9, perhaps because of 29412821241050c846dbceaad4b9752857659977 in ffmpeg (although that's strange, because it was a long time ago). --- src/lib/ffmpeg_decoder.cc | 4 +-- test/ffmpeg_subtitles_test.cc | 60 +++++++++++++++++++++++++++++++++++++++++++ test/wscript | 1 + 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 test/ffmpeg_subtitles_test.cc diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index f57c9efe8..a8bfd2a38 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -816,9 +816,9 @@ FFmpegDecoder::process_ass_subtitle (string ass, ContentTime from) int commas = 0; string text; for (size_t i = 0; i < ass.length(); ++i) { - if (commas < 9 && ass[i] == ',') { + if (commas < 8 && ass[i] == ',') { ++commas; - } else if (commas == 9) { + } else if (commas == 8) { text += ass[i]; } } diff --git a/test/ffmpeg_subtitles_test.cc b/test/ffmpeg_subtitles_test.cc new file mode 100644 index 000000000..da63063cb --- /dev/null +++ b/test/ffmpeg_subtitles_test.cc @@ -0,0 +1,60 @@ +/* + Copyright (C) 2024 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "lib/content_factory.h" +#include "lib/film.h" +#include "lib/player.h" +#include "lib/text_content.h" +#include "test.h" +#include +#include + + +using std::make_shared; +using std::shared_ptr; +using std::string; +using std::vector; +using boost::optional; + + +BOOST_AUTO_TEST_CASE(decoding_ssa_subs_from_mkv) +{ + auto subs = content_factory(TestPaths::private_data() / "ssa_subs.mkv")[0]; + auto film = new_test_film("decoding_ssa_subs_from_mkv", { subs }); + subs->text[0]->set_use(true); + + vector lines; + + auto player = make_shared(film, film->playlist()); + player->Text.connect([&lines](PlayerText text, TextType, optional, dcpomatic::DCPTimePeriod) { + for (auto i: text.string) { + lines.push_back(i.text()); + } + }); + + while (lines.size() <= 2 && !player->pass()) {} + + BOOST_REQUIRE_EQUAL(lines.size(), 3U); + BOOST_CHECK_EQUAL(lines[0], "-You're hungry."); + BOOST_CHECK_EQUAL(lines[1], "-Unit 14, nothing's happening"); + BOOST_CHECK_EQUAL(lines[2], "here, we're gonna go to the beach."); +} + diff --git a/test/wscript b/test/wscript index e9f24f0fe..e32ec9acb 100644 --- a/test/wscript +++ b/test/wscript @@ -94,6 +94,7 @@ def build(bld): ffmpeg_examiner_test.cc ffmpeg_properties_test.cc ffmpeg_pts_offset_test.cc + ffmpeg_subtitles_test.cc file_group_test.cc file_log_test.cc file_naming_test.cc -- cgit v1.2.3