From c0f6929ecfaa79bd5ed1c066e8b5484720c3de12 Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Tue, 14 May 2024 16:07:02 +0100 Subject: [PATCH] SCC: Handle unrecognized SCC codes in SccWord.get_channel() https://github.com/sandflow/ttconv/issues/428 --- src/main/python/ttconv/scc/word.py | 10 +++++----- src/test/python/test_scc_word.py | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/python/ttconv/scc/word.py b/src/main/python/ttconv/scc/word.py index e7bc8ae8..87cdfa85 100644 --- a/src/main/python/ttconv/scc/word.py +++ b/src/main/python/ttconv/scc/word.py @@ -119,8 +119,8 @@ def is_code(self) -> bool: def get_channel(self) -> Optional[SccChannel]: """Returns the caption channel, if the word is an SCC code""" - if self.is_code(): - if isinstance(self.code, SccPreambleAddressCode): - return self.code.get_channel() - return self.code.get_channel(self.value) - return None + if self.code is None: + return None + if isinstance(self.code, SccPreambleAddressCode): + return self.code.get_channel() + return self.code.get_channel(self.value) diff --git a/src/test/python/test_scc_word.py b/src/test/python/test_scc_word.py index 682d96f2..790e3667 100644 --- a/src/test/python/test_scc_word.py +++ b/src/test/python/test_scc_word.py @@ -29,6 +29,7 @@ import unittest +from ttconv.scc.codes import SccChannel from ttconv.scc.codes.control_codes import SccControlCode from ttconv.scc.codes.extended_characters import SccExtendedCharacter from ttconv.scc.codes.mid_row_codes import SccMidRowCode @@ -136,3 +137,26 @@ def test_scc_word_get_code(self): self.assertEqual(None, SccWord.from_str("2065").get_code()) # " e" self.assertEqual(None, SccWord.from_str("6c69").get_code()) # "li" self.assertEqual(None, SccWord.from_str("742e").get_code()) # "t." + + def test_scc_word_get_channel(self): + # invalid codes + self.assertEqual(None, SccWord.from_value(0x1000).get_channel()) + self.assertEqual(None, SccWord.from_value(0x1432).get_channel()) + self.assertEqual(None, SccWord.from_value(0x1d00).get_channel()) + self.assertEqual(None, SccWord.from_value(0x1f38).get_channel()) + + # Preamble Address Code + self.assertEqual(SccChannel.CHANNEL_1, SccWord.from_value(0x91d0).get_channel()) + self.assertEqual(SccChannel.CHANNEL_2, SccWord.from_value(0x99d0).get_channel()) + + # Attribute Code + self.assertEqual(SccChannel.CHANNEL_1, SccWord.from_value(0x1020).get_channel()) + self.assertEqual(SccChannel.CHANNEL_2, SccWord.from_value(0x1820).get_channel()) + + def test_scc_word_all_values(self): + # check that all possible values decode to something + for i in range(0x10000): + scc_word = SccWord.from_value(i) + scc_word.to_text() + scc_word.get_code() + scc_word.get_channel()