diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-12-05 00:53:34 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-12-05 23:37:22 +0100 |
| commit | ff8c5e660a4474fa4b790ad676d868c7260d9809 (patch) | |
| tree | 45982e8bb551d0a814bc31a7b31e40ba147bc0eb | |
| parent | f485d588bebc4bc4039701bb04d7dc83f025d107 (diff) | |
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).
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 4 | ||||
| -rw-r--r-- | test/ffmpeg_subtitles_test.cc | 60 | ||||
| -rw-r--r-- | test/wscript | 1 |
3 files changed, 63 insertions, 2 deletions
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 <cth@carlh.net> + + 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 <http://www.gnu.org/licenses/>. + +*/ + + +#include "lib/content_factory.h" +#include "lib/film.h" +#include "lib/player.h" +#include "lib/text_content.h" +#include "test.h" +#include <boost/optional.hpp> +#include <boost/test/unit_test.hpp> + + +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<string> lines; + + auto player = make_shared<Player>(film, film->playlist()); + player->Text.connect([&lines](PlayerText text, TextType, optional<DCPTextTrack>, 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 |
