From a240010fbac070dca01b0c0452f57cc35f675d39 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 27 Jun 2024 22:14:21 +0200 Subject: Extract method to a header to make it testable. --- src/verify.cc | 13 ++----------- src/verify.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/verify.cc b/src/verify.cc index 112a5bb5..871a9fd1 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1182,18 +1182,9 @@ verify_closed_caption_details ( } -struct LinesCharactersResult -{ - bool warning_length_exceeded = false; - bool error_length_exceeded = false; - bool line_count_exceeded = false; -}; - - -static void -verify_text_lines_and_characters ( - shared_ptr asset, +dcp::verify_text_lines_and_characters( + shared_ptr asset, int warning_length, int error_length, LinesCharactersResult* result diff --git a/src/verify.h b/src/verify.h index b5d913bd..204d83b0 100644 --- a/src/verify.h +++ b/src/verify.h @@ -58,6 +58,9 @@ namespace dcp { +class SubtitleAsset; + + class VerificationNote { public: @@ -675,6 +678,21 @@ bool operator< (dcp::VerificationNote const& a, dcp::VerificationNote const& b); std::ostream& operator<<(std::ostream& s, dcp::VerificationNote const& note); +struct LinesCharactersResult +{ + bool warning_length_exceeded = false; + bool error_length_exceeded = false; + bool line_count_exceeded = false; +}; + + +extern void verify_text_lines_and_characters( + std::shared_ptr asset, + int warning_length, + int error_length, + dcp::LinesCharactersResult* result + ); + } -- cgit v1.2.3 From da9d093b4e0a84eb25838b70da80cb173f3f63c1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 27 Jun 2024 22:15:24 +0200 Subject: Some comments and default values. --- src/verify.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/verify.cc b/src/verify.cc index 871a9fd1..49cc4e2a 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1205,8 +1205,8 @@ dcp::verify_text_lines_and_characters( {} Time time; - int position; //< position from 0 at top of screen to 100 at bottom - int characters; + int position = 0; ///< vertical position from 0 at top of screen to 100 at bottom + int characters = 0; ///< number of characters in the text of this event shared_ptr start; }; @@ -1225,6 +1225,7 @@ dcp::verify_text_lines_and_characters( return 0L; }; + /* Make a list of "subtitle starts" and "subtitle ends" events */ for (auto j: asset->subtitles()) { auto text = dynamic_pointer_cast(j); if (text) { -- cgit v1.2.3 From 9b9088756ad46190ae25aac568fb05b36c2237eb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 27 Jun 2024 22:15:33 +0200 Subject: Whitespace. --- src/verify.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/verify.cc b/src/verify.cc index 49cc4e2a..9389d438 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -1235,7 +1235,7 @@ dcp::verify_text_lines_and_characters( } } - std::sort(events.begin(), events.end(), [](shared_ptr const& a, shared_ptrconst& b) { + std::sort(events.begin(), events.end(), [](shared_ptr const& a, shared_ptr const& b) { return a->time < b->time; }); -- cgit v1.2.3 From 4b2a91af4331c1c7bc540fb352b1099292b5f753 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 27 Jun 2024 22:16:04 +0200 Subject: Speculative fix for assertion failure (DoM #2839). --- src/verify.cc | 25 +++++++++++++++++-------- test/verify_test.cc | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/verify.cc b/src/verify.cc index 9389d438..ec8925f2 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -81,6 +81,7 @@ #include #include #include +#include #include #include #include @@ -1239,16 +1240,21 @@ dcp::verify_text_lines_and_characters( return a->time < b->time; }); - map current; + /* The number of characters currently displayed at different vertical positions, i.e. on + * what we consider different lines. Key is the vertical position (0 to 100) and the value + * is a list of the active subtitles in that position. + */ + map>> current; for (auto i: events) { if (current.size() > 3) { result->line_count_exceeded = true; } for (auto j: current) { - if (j.second > warning_length) { + int length = std::accumulate(j.second.begin(), j.second.end(), 0, [](int total, shared_ptr event) { return total + event->characters; }); + if (length > warning_length) { result->warning_length_exceeded = true; } - if (j.second > error_length) { + if (length > error_length) { result->error_length_exceeded = true; } } @@ -1256,17 +1262,20 @@ dcp::verify_text_lines_and_characters( if (i->start) { /* end of a subtitle */ DCP_ASSERT (current.find(i->start->position) != current.end()); - if (current[i->start->position] == i->start->characters) { + auto current_position = current[i->start->position]; + auto iter = std::find(current_position.begin(), current_position.end(), i->start); + if (iter != current_position.end()) { + current_position.erase(iter); + } + if (current_position.empty()) { current.erase(i->start->position); - } else { - current[i->start->position] -= i->start->characters; } } else { /* start of a subtitle */ if (current.find(i->position) == current.end()) { - current[i->position] = i->characters; + current[i->position] = vector>{i}; } else { - current[i->position] += i->characters; + current[i->position].push_back(i); } } } diff --git a/test/verify_test.cc b/test/verify_test.cc index 5a9489fe..eab50b59 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -3986,3 +3986,37 @@ BOOST_AUTO_TEST_CASE(verify_encrypted_smpte_dcp) } +BOOST_AUTO_TEST_CASE(overlapping_subtitles) +{ + auto asset = make_shared(); + + asset->add(std::make_shared( + optional{}, false, false, false, + dcp::Colour{}, 42, 0, + dcp::Time(0, 0, 0, 0, 24), + dcp::Time(0, 0, 8, 0, 24), + 0, dcp::HAlign::CENTER, + 0, dcp::VAlign::CENTER, + 0, + dcp::Direction::LTR, + "", + dcp::Effect::NONE, dcp::Colour{}, dcp::Time{}, dcp::Time{}, 0, vector{} + )); + + asset->add(std::make_shared( + optional{}, false, false, false, + dcp::Colour{}, 42, 0, + dcp::Time(0, 0, 2, 0, 24), + dcp::Time(0, 0, 4, 0, 24), + 0, dcp::HAlign::CENTER, + 0, dcp::VAlign::CENTER, + 0, + dcp::Direction::LTR, + "Hello", + dcp::Effect::NONE, dcp::Colour{}, dcp::Time{}, dcp::Time{}, 0, vector{} + )); + + dcp::LinesCharactersResult result; + dcp::verify_text_lines_and_characters(asset, 64, 80, &result); +} + -- cgit v1.2.3