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 7339720ece..24d7cab070 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 @@ -17,10 +17,16 @@ package androidx.media3.exoplayer.text; import androidx.annotation.Nullable; import androidx.media3.common.Format; +import androidx.media3.common.MimeTypes; import androidx.media3.common.util.UnstableApi; import androidx.media3.extractor.text.DefaultSubtitleParserFactory; import androidx.media3.extractor.text.SubtitleDecoder; import androidx.media3.extractor.text.SubtitleParser; +import androidx.media3.extractor.text.cea.Cea608Decoder; +import androidx.media3.extractor.text.cea.Cea608Parser; +import androidx.media3.extractor.text.cea.Cea708Decoder; +import androidx.media3.extractor.text.cea.Cea708Parser; +import java.util.Objects; /** A factory for {@link SubtitleDecoder} instances. */ @UnstableApi @@ -47,7 +53,12 @@ public interface SubtitleDecoderFactory { /** * Default {@link SubtitleDecoderFactory} implementation. * - *

Only supports formats supported by {@link DefaultSubtitleParserFactory}. + *

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

*/ SubtitleDecoderFactory DEFAULT = new SubtitleDecoderFactory() { @@ -56,17 +67,37 @@ public interface SubtitleDecoderFactory { @Override public boolean supportsFormat(Format format) { - return delegate.supportsFormat(format); + @Nullable String mimeType = format.sampleMimeType; + return delegate.supportsFormat(format) + || Objects.equals(mimeType, MimeTypes.APPLICATION_CEA608) + || Objects.equals(mimeType, MimeTypes.APPLICATION_MP4CEA608) + || Objects.equals(mimeType, MimeTypes.APPLICATION_CEA708); } @Override public SubtitleDecoder createDecoder(Format format) { + @Nullable String mimeType = format.sampleMimeType; + if (mimeType != null) { + switch (mimeType) { + case MimeTypes.APPLICATION_CEA608: + case MimeTypes.APPLICATION_MP4CEA608: + return new Cea608Decoder( + new Cea608Parser( + mimeType, + format.accessibilityChannel, + Cea608Parser.MIN_DATA_CHANNEL_TIMEOUT_MS)); + case MimeTypes.APPLICATION_CEA708: + return new Cea708Decoder( + new Cea708Parser(format.accessibilityChannel, format.initializationData)); + default: + break; + } + } if (delegate.supportsFormat(format)) { SubtitleParser subtitleParser = delegate.create(format); return new DelegatingSubtitleDecoder( subtitleParser.getClass().getSimpleName() + "Decoder", subtitleParser); } - @Nullable String mimeType = format.sampleMimeType; throw new IllegalArgumentException( "Attempted to create decoder for unsupported MIME type: " + mimeType); }