From 28eb55c077efcf8ab739acbb208e6bbe106c91d0 Mon Sep 17 00:00:00 2001 From: datdoantelus Date: Wed, 3 Jan 2024 09:26:51 -0500 Subject: [PATCH] Use skipBits(2) instead of readBits for ignored bits. Add singleServiceAndWindowDefinition_ignoreRowLock test to Cea708ParserTest --- .../extractor/text/cea/Cea708Parser.java | 2 +- .../extractor/text/cea/Cea708ParserTest.java | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Parser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Parser.java index ec6822f509..9f8002f8de 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Parser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Parser.java @@ -785,7 +785,7 @@ public final class Cea708Parser implements SubtitleParser { boolean visible = captionChannelPacketData.readBit(); // ANSI/CTA-708-E S-2023 spec (Section 8.4.7) indicates that rowLock and columnLock should be ignored and assumed to be lock - captionChannelPacketData.readBits(2); + captionChannelPacketData.skipBits(2); boolean rowLock = true; boolean columnLock = true; diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/text/cea/Cea708ParserTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/text/cea/Cea708ParserTest.java index 3910fa0093..c1bbc2fbed 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/text/cea/Cea708ParserTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/text/cea/Cea708ParserTest.java @@ -42,6 +42,7 @@ public class Cea708ParserTest { private static final byte CHANNEL_PACKET_DATA = 0x6; private static final byte CHANNEL_PACKET_END = 0x2; + @Test public void singleServiceAndWindowDefinition() throws Exception { Cea708Parser cea708Parser = @@ -115,6 +116,47 @@ public class Cea708ParserTest { .isEqualTo("test subtitle"); } + @Test + public void singleServiceAndWindowDefinition_ignoreRowLock() throws Exception { + Cea708Parser cea708Parser = + new Cea708Parser( + /* accessibilityChannel= */ Format.NO_VALUE, /* initializationData= */ null); + byte[] windowDefinition = + TestUtil.createByteArray( + 0x98, // DF0 command (define window 0) + 0b0010_0000, // visible=true, row lock and column lock disabled, priority=0 + 0xF0 | 50, // relative positioning, anchor vertical + 50, // anchor horizontal + 1, // anchor point = 0, row count = 10 + 30, // column count = 30 + 0b0000_1001); // window style = 1, pen style = 1 + byte[] setCurrentWindow = TestUtil.createByteArray(0x80); // CW0 (set current window to 0) + byte[] subtitleData = + encodePacketIntoBytePairs( + createPacket( + /* sequenceNumber= */ 0, + createServiceBlock( + Bytes.concat( + windowDefinition, + setCurrentWindow, + "row1\r\nrow2\r\nrow3\r\nrow4".getBytes(Charsets.US_ASCII))))); + byte[] garbagePrefix = TestUtil.buildTestData(subtitleData.length * 2); + byte[] garbageSuffix = TestUtil.buildTestData(10); + byte[] subtitleDataWithGarbagePrefixAndSuffix = + Bytes.concat(garbagePrefix, subtitleData, garbageSuffix); + + List result = new ArrayList<>(); + cea708Parser.parse( + subtitleDataWithGarbagePrefixAndSuffix, + garbagePrefix.length, + subtitleData.length, + SubtitleParser.OutputOptions.allCues(), + result::add); + + assertThat(Iterables.getOnlyElement(Iterables.getOnlyElement(result).cues).text.toString()) + .isEqualTo("row3\nrow4"); + } + /** See section 4.4.1 of the CEA-708-B spec. */ private static byte[] encodePacketIntoBytePairs(byte[] packet) { checkState(packet.length % 2 == 0);