From 291ddbd18999091da9c9d928971e61dc22bfe706 Mon Sep 17 00:00:00 2001 From: Pierre-Anthony Lemieux Date: Wed, 12 Jul 2023 22:38:35 -0700 Subject: [PATCH 01/18] Fixed empty ISD bug --- src/main/python/imschrm/hrm.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/python/imschrm/hrm.py b/src/main/python/imschrm/hrm.py index 27473dc..dc68e2e 100644 --- a/src/main/python/imschrm/hrm.py +++ b/src/main/python/imschrm/hrm.py @@ -75,6 +75,7 @@ def _format_message(msg: str, doc_index: int, time_offset: Fraction, available_t return ( f"{msg} at {float(time_offset):.3f}s (doc #{doc_index})\n" f" available time: {float(available_time):.3f}s | HRM time: {float(stats.dur):.3f}\n" + f" ngra_t: {float(stats.ngra_t):.3f}\n" f" Glyph copy count: {stats.gcpy_count} | render count: {stats.gren_count} | Background draw count: {stats.nbg_total} | Clear: {stats.clear}\n" ) @@ -92,7 +93,7 @@ def debug(self, msg: str, doc_index: int, time_offset: Fraction, available_time: LOGGER.debug(EventHandler._format_message(msg, doc_index, time_offset, available_time, stats)) -def validate(isd_iterator: typing.Iterator[typing.Tuple[Fraction, ttconv.isd.ISD]], event_handler: typing.Type[EventHandler]=EventHandler()): +def validate(isd_iterator: typing.Iterator[typing.Tuple[Fraction, ttconv.isd.ISD]], event_handler: typing.Type[EventHandler]=EventHandler(), tolerance: float=0): '''Determines whether the sequence of ISDs returned by `isd_iterator` conform to the IMSC HRM. `isd_iterator` returns a sequence of tuplets `(begin, ISD)`, where `ISD` is an ISD instance whose active interval starts at `begin` seconds and ends immediately before the `begin` value of the next @@ -115,10 +116,10 @@ def validate(isd_iterator: typing.Iterator[typing.Tuple[Fraction, ttconv.isd.ISD event_handler.debug("Processed document", doc_index, time_offset, avail_render_time, stats) if not stats.is_empty: - if stats.dur > avail_render_time: + if stats.dur - avail_render_time > tolerance: event_handler.error("Rendering time exceeded", doc_index, time_offset, avail_render_time, stats) - if stats.ngra_t > _NGBS: + if stats.ngra_t - _NGBS > tolerance: event_handler.error("NGBS exceeded", doc_index, time_offset, avail_render_time, stats) last_render_time = time_offset @@ -150,11 +151,23 @@ def next_isd( self.isd_stats = ISDStatistics() - self._compute_dur_t(isd) + self.isd_stats.is_empty = True + + if isd is not None: + for region in isd.iter_regions(): + + if not _is_presented_region(region): + continue + + self.isd_stats.is_empty = False + + if not self.isd_stats.is_empty: + + self._compute_dur_t(isd) - self._compute_dur_d(isd) + self._compute_dur_d(isd) - self.isd_stats.dur = self.isd_stats.dur_t + self.isd_stats.dur_d + self.isd_stats.dur = self.isd_stats.dur_t + self.isd_stats.dur_d return self.isd_stats From a2888f9f695e227774a7d65bfd8422d2325f9327 Mon Sep 17 00:00:00 2001 From: Pierre-Anthony Lemieux Date: Wed, 12 Jul 2023 22:38:45 -0700 Subject: [PATCH 02/18] Added tolerance --- src/main/python/imschrm/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/python/imschrm/cli.py b/src/main/python/imschrm/cli.py index 0b2c028..05d21db 100644 --- a/src/main/python/imschrm/cli.py +++ b/src/main/python/imschrm/cli.py @@ -95,7 +95,7 @@ def main(argv=None): logging.basicConfig(level=logging.WARNING) - imschrm.hrm.validate(imschrm.doc_sequence.iter_isd(doc_sequence), ev) + imschrm.hrm.validate(imschrm.doc_sequence.iter_isd(doc_sequence), ev, 0) if ev.failed: print("Validation failed") From cd94a9a319b7d67c06d16b4e66ad42240de9204a Mon Sep 17 00:00:00 2001 From: Pierre-Anthony Lemieux Date: Wed, 12 Jul 2023 22:38:55 -0700 Subject: [PATCH 03/18] Added tests --- src/test/python/test_suite.py | 60 +++++++++++++++++++ .../ttml/test-suite/fail/dur001-fail.ttml | 13 ++++ .../ttml/test-suite/fail/dur002-fail.ttml | 13 ++++ .../ttml/test-suite/fail/dur003-fail.ttml | 22 +++++++ .../ttml/test-suite/fail/dur004-fail.ttml | 13 ++++ .../ttml/test-suite/fail/dur005-fail.ttml | 25 ++++++++ .../ttml/test-suite/fail/dur006-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur007-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur008-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur009-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur010-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur011-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur012-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur013-fail.ttml | 11 ++++ .../ttml/test-suite/fail/dur014-fail.ttml | 13 ++++ .../ttml/test-suite/fail/ipd001-fail.ttml | 15 +++++ .../ttml/test-suite/fail/ipd002-fail.ttml | 15 +++++ .../ttml/test-suite/fail/ipd003-fail.ttml | 21 +++++++ .../ttml/test-suite/fail/ipd004-fail.ttml | 13 ++++ .../ttml/test-suite/fail/ipd005-fail.ttml | 13 ++++ .../ttml/test-suite/fail/ipd006-fail.ttml | 22 +++++++ .../ttml/test-suite/fail/ngbs001-fail.ttml | 12 ++++ .../ttml/test-suite/fail/ngbs002-fail.ttml | 11 ++++ 23 files changed, 369 insertions(+) create mode 100644 src/test/python/test_suite.py create mode 100644 src/test/resources/ttml/test-suite/fail/dur001-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur002-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur003-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur004-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur005-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur006-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur007-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur008-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur009-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur010-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur011-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur012-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur013-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/dur014-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd001-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd002-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd003-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd004-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd005-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ipd006-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ngbs001-fail.ttml create mode 100644 src/test/resources/ttml/test-suite/fail/ngbs002-fail.ttml diff --git a/src/test/python/test_suite.py b/src/test/python/test_suite.py new file mode 100644 index 0000000..e481b11 --- /dev/null +++ b/src/test/python/test_suite.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# Copyright (c) 2023, Sandflow Consulting LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""HRM Test Suite""" + +__author__ = "Pierre-Anthony Lemieux " + +# pylint: disable=R0201,C0115,C0116,W0212 +import unittest +import os.path +from fractions import Fraction + +import imschrm.hrm +import imschrm.doc_sequence + +class EventHandler(imschrm.hrm.EventHandler): + + def __init__(self): + self.failed = False + + def error(self, msg: str, doc_index: int, time_offset: Fraction, available_time: Fraction, stats: imschrm.hrm.ISDStatistics): + self.failed = True + +class HRMTestSuite(unittest.TestCase): + + def test_test_suite(self): + ev = EventHandler() + for root, _subdirs, files in os.walk("src/test/resources/ttml/test-suite/fail"): + for filename in files: + (name, ext) = os.path.splitext(filename) + if ext == ".ttml": + with self.subTest(name): + with open(os.path.join(root, filename), "r", encoding="utf-8") as f: + imschrm.hrm.validate(imschrm.doc_sequence.iter_isd([(0, None, f.read())]), ev, 0) + self.assertTrue(ev.failed) + +if __name__ == '__main__': + unittest.main() diff --git a/src/test/resources/ttml/test-suite/fail/dur001-fail.ttml b/src/test/resources/ttml/test-suite/fail/dur001-fail.ttml new file mode 100644 index 0000000..387c046 --- /dev/null +++ b/src/test/resources/ttml/test-suite/fail/dur001-fail.ttml @@ -0,0 +1,13 @@ + + + + + +
+

a

+

あいうえおかきくけこさしすせそたち

+
+ +
diff --git a/src/test/resources/ttml/test-suite/fail/dur002-fail.ttml b/src/test/resources/ttml/test-suite/fail/dur002-fail.ttml new file mode 100644 index 0000000..b3ded5f --- /dev/null +++ b/src/test/resources/ttml/test-suite/fail/dur002-fail.ttml @@ -0,0 +1,13 @@ + + + + + +
+

z

+

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

+
+ +
diff --git a/src/test/resources/ttml/test-suite/fail/dur003-fail.ttml b/src/test/resources/ttml/test-suite/fail/dur003-fail.ttml new file mode 100644 index 0000000..a6b096e --- /dev/null +++ b/src/test/resources/ttml/test-suite/fail/dur003-fail.ttml @@ -0,0 +1,22 @@ + + + + + + + +