diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-12-05 00:53:34 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-12-09 01:40:48 +0100 |
| commit | 08aa3861e526cbf45ac332294a835358f3903207 (patch) | |
| tree | 8a6948d9c27828ef22b32f192e5d4f12b70a3b0c | |
| parent | 5a980207377e67b6aa3595d0cde441ae7659f5a6 (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).
| -rwxr-xr-x | run/tests | 2 | ||||
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 4 | ||||
| -rw-r--r-- | test/ffmpeg_subtitles_test.cc | 60 | ||||
| -rw-r--r-- | test/wscript | 1 |
4 files changed, 64 insertions, 3 deletions
@@ -3,7 +3,7 @@ # e.g. --run_tests=foo set -e -PRIVATE_GIT="65c6d0cf0ec188e4d53fc8c9d61958c7921219d6" +PRIVATE_GIT="083f563af5a4b21a91aa4ea9e2749aa4f0e1bcb2" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" source $DIR/environment 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 |
