From f0f24aa0d4617905c44f2947e47b26355b84abc3 Mon Sep 17 00:00:00 2001 From: jbibik Date: Wed, 19 Jul 2023 14:31:22 +0100 Subject: [PATCH] `WebvttParser` implementation - moved from `WebvttDecoder` `WebvttDecoder` which used to be `SimpleSubtitleDecoder` will now be called `WebvttParser` and implement `SubtitleParser` interface. For backwards compatibility, we will have the same functionality provided by `DelegatingSubtitleDecoder` backed-up by a new `WebvttParser` instance. `WebvttSubtitle` will still be used behind the scenes to handle overlapping `Cues`. PiperOrigin-RevId: 549298733 --- .../text/DelegatingSubtitleDecoder.java | 20 +- .../text/SubtitleDecoderFactory.java | 5 - ...gSubtitleDecoderWithWebvttParserTest.java} | 136 ++--- .../text/DefaultSubtitleParserFactory.java | 7 +- .../{WebvttDecoder.java => WebvttParser.java} | 27 +- .../extractor/text/SubtitleExtractorTest.java | 37 +- .../text/webvtt/WebvttParserTest.java | 563 ++++++++++++++++++ 7 files changed, 660 insertions(+), 135 deletions(-) rename libraries/{extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttDecoderTest.java => exoplayer/src/test/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoderWithWebvttParserTest.java} (92%) rename libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/{WebvttDecoder.java => WebvttParser.java} (84%) create mode 100644 libraries/extractor/src/test/java/androidx/media3/extractor/text/webvtt/WebvttParserTest.java diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoder.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoder.java index ebbb156af7..d812bd11e5 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoder.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoder.java @@ -15,7 +15,10 @@ */ package androidx.media3.exoplayer.text; +import static androidx.annotation.VisibleForTesting.PACKAGE_PRIVATE; + import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.media3.extractor.text.CuesWithTiming; import androidx.media3.extractor.text.SimpleSubtitleDecoder; import androidx.media3.extractor.text.Subtitle; @@ -43,17 +46,19 @@ import java.util.List; *
  • DelegatingSubtitleDecoder("XXX", new XXXParser(initializationData)) *
  • XXXDecoder(initializationData) * - * - *

    TODO(b/289983417): this will only be used in the old decoding flow (Decoder after SampleQueue) - * while we maintain dual architecture. Once we fully migrate to the pre-SampleQueue flow, it can be - * deprecated and later deleted. */ -/* package */ final class DelegatingSubtitleDecoder extends SimpleSubtitleDecoder { +// TODO(b/289983417): this will only be used in the old decoding flow (Decoder after SampleQueue) +// while we maintain dual architecture. Once we fully migrate to the pre-SampleQueue flow, it can be +// deprecated and later deleted. +// TODO: remove VisibleForTesting annotation once SubtitleExtractor uses SubtitleParser (rather than +// SubtitleDecoder) and SubtitleExtractorTest is refactored +@VisibleForTesting(otherwise = PACKAGE_PRIVATE) +public final class DelegatingSubtitleDecoder extends SimpleSubtitleDecoder { private static final Subtitle EMPTY_SUBTITLE = new CuesWithTimingSubtitle(ImmutableList.of()); private final SubtitleParser subtitleParser; - /* package */ DelegatingSubtitleDecoder(String name, SubtitleParser subtitleParser) { + public DelegatingSubtitleDecoder(String name, SubtitleParser subtitleParser) { super(name); this.subtitleParser = subtitleParser; } @@ -63,7 +68,8 @@ import java.util.List; if (reset) { subtitleParser.reset(); } - @Nullable List cuesWithTiming = subtitleParser.parse(data); + @Nullable + List cuesWithTiming = subtitleParser.parse(data, /* offset= */ 0, length); if (cuesWithTiming == null) { return EMPTY_SUBTITLE; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/SubtitleDecoderFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/SubtitleDecoderFactory.java index 815e525eb7..de4450643e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/SubtitleDecoderFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/SubtitleDecoderFactory.java @@ -25,7 +25,6 @@ import androidx.media3.extractor.text.SubtitleParser; import androidx.media3.extractor.text.cea.Cea608Decoder; import androidx.media3.extractor.text.cea.Cea708Decoder; import androidx.media3.extractor.text.ttml.TtmlDecoder; -import androidx.media3.extractor.text.webvtt.WebvttDecoder; import java.util.Objects; /** A factory for {@link SubtitleDecoder} instances. */ @@ -56,7 +55,6 @@ public interface SubtitleDecoderFactory { *

    Supports formats supported by {@link DefaultSubtitleParserFactory} as well as the following: * *