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:
+ *
+ *
+ * - Cea608 ({@link Cea608Decoder})
+ *
- Cea708 ({@link Cea708Decoder})
+ *
*/
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);
}