diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-12-02 10:09:30 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-12-02 10:09:30 +0100 |
| commit | 2b522d0382a6d4534f1504123a9d16700fe50f0a (patch) | |
| tree | 63d5c8ee3a82ee739f98957ef425afc8286778b5 /src | |
| parent | 3c90f397bf2222e0249ba169df0dac75b556f989 (diff) | |
Fix equals() with image subtitles to not compare unique IDs.
Also add an option to save subtitle images to PNGs when they differ.
Diffstat (limited to 'src')
| -rw-r--r-- | src/subtitle_asset.cc | 9 | ||||
| -rw-r--r-- | src/subtitle_image.cc | 69 | ||||
| -rw-r--r-- | src/subtitle_image.h | 2 | ||||
| -rw-r--r-- | src/types.h | 5 |
4 files changed, 79 insertions, 6 deletions
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index c6d2e790..96e5cba5 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -452,7 +452,7 @@ SubtitleAsset::equals (shared_ptr<const Asset> other_asset, EqualityOptions opti } if (_subtitles.size() != other->_subtitles.size()) { - note (DCP_ERROR, "subtitles differ"); + note (DCP_ERROR, String::compose("different number of subtitles: %1 vs %2", _subtitles.size(), other->_subtitles.size())); return false; } @@ -466,17 +466,16 @@ SubtitleAsset::equals (shared_ptr<const Asset> other_asset, EqualityOptions opti shared_ptr<SubtitleImage> image_j = dynamic_pointer_cast<SubtitleImage> (*j); if ((string_i && !string_j) || (image_i && !image_j)) { - note (DCP_ERROR, "subtitles differ"); + note (DCP_ERROR, "subtitles differ: string vs. image"); return false; } if (string_i && *string_i != *string_j) { - note (DCP_ERROR, "subtitles differ"); + note (DCP_ERROR, String::compose("subtitles differ in text or metadata: %1 vs %2", string_i->text(), string_j->text())); return false; } - if (image_i && *image_i != *image_j) { - note (DCP_ERROR, "subtitles differ"); + if (image_i && !image_i->equals(image_j, options, note)) { return false; } diff --git a/src/subtitle_image.cc b/src/subtitle_image.cc index d8215850..e280e392 100644 --- a/src/subtitle_image.cc +++ b/src/subtitle_image.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington <cth@carlh.net> + Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net> This file is part of libdcp. @@ -36,6 +36,7 @@ using std::ostream; using std::string; +using boost::shared_ptr; using namespace dcp; SubtitleImage::SubtitleImage ( @@ -112,6 +113,71 @@ dcp::operator!= (SubtitleImage const & a, SubtitleImage const & b) return !(a == b); } +bool +SubtitleImage::equals (shared_ptr<SubtitleImage> other, EqualityOptions options, NoteHandler note) +{ + if (png_image() != other->png_image()) { + note (DCP_ERROR, "subtitle image PNG data differs"); + if (options.export_differing_subtitles) { + string const base = "dcpdiff_subtitle_"; + if (boost::filesystem::exists(base + "A.png")) { + note (DCP_ERROR, "could not export subtitle as " + base + "A.png already exists"); + } else { + png_image().write(base + "A.png"); + } + if (boost::filesystem::exists(base + "B.png")) { + note (DCP_ERROR, "could not export subtitle as " + base + "B.png already exists"); + } else { + other->png_image().write(base + "B.png"); + } + options.export_differing_subtitles = false; + } + return false; + } + + if (in() != other->in()) { + note (DCP_ERROR, "subtitle in times differ"); + return false; + } + + if (out() != other->out()) { + note (DCP_ERROR, "subtitle out times differ"); + return false; + } + + if (h_position() != other->h_position()) { + note (DCP_ERROR, "subtitle horizontal positions differ"); + return false; + } + + if (h_align() != other->h_align()) { + note (DCP_ERROR, "subtitle horizontal alignments differ"); + return false; + } + + if (v_position() != other->v_position()) { + note (DCP_ERROR, "subtitle vertical positions differ"); + return false; + } + + if (v_align() != other->v_align()) { + note (DCP_ERROR, "subtitle vertical alignments differ"); + return false; + } + + if (fade_up_time() != other->fade_up_time()) { + note (DCP_ERROR, "subtitle fade-up times differ"); + return false; + } + + if (fade_down_time() != other->fade_down_time()) { + note (DCP_ERROR, "subtitle fade-down times differ"); + return false; + } + + return true; +} + ostream& dcp::operator<< (ostream& s, SubtitleImage const & sub) { @@ -122,3 +188,4 @@ dcp::operator<< (ostream& s, SubtitleImage const & sub) return s; } + diff --git a/src/subtitle_image.h b/src/subtitle_image.h index 76c34765..e397fb2b 100644 --- a/src/subtitle_image.h +++ b/src/subtitle_image.h @@ -99,6 +99,8 @@ public: return _file; } + bool equals (boost::shared_ptr<dcp::SubtitleImage> other, EqualityOptions options, NoteHandler note); + private: ArrayData _png_image; std::string _id; diff --git a/src/types.h b/src/types.h index 684145dd..1102f16b 100644 --- a/src/types.h +++ b/src/types.h @@ -215,6 +215,8 @@ extern std::ostream& operator<< (std::ostream& s, Fraction const & f); * * When comparing things, we want to be able to ignore some differences; * this class expresses those differences. + * + * It also contains some settings for how the comparison should be done. */ struct EqualityOptions { @@ -229,6 +231,7 @@ struct EqualityOptions , issue_dates_can_differ (false) , load_font_nodes_can_differ (false) , keep_going (false) + , export_differing_subtitles (false) {} /** The maximum allowable mean difference in pixel value between two images */ @@ -247,6 +250,8 @@ struct EqualityOptions bool issue_dates_can_differ; bool load_font_nodes_can_differ; bool keep_going; + /** true to save the first pair of differeng image subtitles to the current working directory */ + bool export_differing_subtitles; }; /* I've been unable to make mingw happy with ERROR as a symbol, so |
