Migrate CEA-708 logic to a SubtitleParser implementation

This change is similar to 27caeb8038 (CEA-608), but is currently lacking unit tests.

PiperOrigin-RevId: 582585457
This commit is contained in:
jbibik 2023-11-15 01:36:07 -08:00 committed by Copybara-Service
parent b23b1bb693
commit 94e45eb4ad
4 changed files with 1513 additions and 1440 deletions

View File

@ -17,15 +17,10 @@ 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 java.util.Objects;
/** A factory for {@link SubtitleDecoder} instances. */
@UnstableApi
@ -52,12 +47,7 @@ public interface SubtitleDecoderFactory {
/**
* Default {@link SubtitleDecoderFactory} implementation.
*
* <p>Supports formats supported by {@link DefaultSubtitleParserFactory} as well as the following:
*
* <ul>
* <li>Cea608 ({@link Cea608Decoder})
* <li>Cea708 ({@link Cea708Decoder})
* </ul>
* <p>Only supports formats supported by {@link DefaultSubtitleParserFactory}.
*/
SubtitleDecoderFactory DEFAULT =
new SubtitleDecoderFactory() {
@ -66,11 +56,7 @@ public interface SubtitleDecoderFactory {
@Override
public boolean supportsFormat(Format 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);
return delegate.supportsFormat(format);
}
@Override
@ -81,21 +67,6 @@ public interface SubtitleDecoderFactory {
subtitleParser.getClass().getSimpleName() + "Decoder", subtitleParser);
}
@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(format.accessibilityChannel, format.initializationData);
default:
break;
}
}
throw new IllegalArgumentException(
"Attempted to create decoder for unsupported MIME type: " + mimeType);
}

View File

@ -21,6 +21,7 @@ import androidx.media3.common.Format.CueReplacementBehavior;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.extractor.text.cea.Cea608Parser;
import androidx.media3.extractor.text.cea.Cea708Parser;
import androidx.media3.extractor.text.dvb.DvbParser;
import androidx.media3.extractor.text.pgs.PgsParser;
import androidx.media3.extractor.text.ssa.SsaParser;
@ -46,6 +47,7 @@ import java.util.Objects;
* <li>DVB ({@link DvbParser})
* <li>TTML ({@link TtmlParser})
* <li>CEA-608 ({@link Cea608Parser})
* <li>CEA-708 ({@link Cea708Parser})
* </ul>
*/
@UnstableApi
@ -63,7 +65,8 @@ public final class DefaultSubtitleParserFactory implements SubtitleParser.Factor
|| Objects.equals(mimeType, MimeTypes.APPLICATION_DVBSUBS)
|| Objects.equals(mimeType, MimeTypes.APPLICATION_TTML)
|| Objects.equals(mimeType, MimeTypes.APPLICATION_MP4CEA608)
|| Objects.equals(mimeType, MimeTypes.APPLICATION_CEA608);
|| Objects.equals(mimeType, MimeTypes.APPLICATION_CEA608)
|| Objects.equals(mimeType, MimeTypes.APPLICATION_CEA708);
}
@Override
@ -90,6 +93,8 @@ public final class DefaultSubtitleParserFactory implements SubtitleParser.Factor
case MimeTypes.APPLICATION_MP4CEA608:
case MimeTypes.APPLICATION_CEA608:
return Cea608Parser.CUE_REPLACEMENT_BEHAVIOR;
case MimeTypes.APPLICATION_CEA708:
return Cea708Parser.CUE_REPLACEMENT_BEHAVIOR;
default:
break;
}
@ -127,6 +132,8 @@ public final class DefaultSubtitleParserFactory implements SubtitleParser.Factor
mimeType,
format.accessibilityChannel,
/* validDataChannelTimeoutMs= */ 2 * Cea608Parser.MIN_DATA_CHANNEL_TIMEOUT_MS);
case MimeTypes.APPLICATION_CEA708:
return new Cea708Parser(format.accessibilityChannel, format.initializationData);
default:
break;
}