Commit dddb72b2 by ibaker Committed by christosts

Add `DefaultExtractorsFactory.setTsSubtitleFormats`

ExoPlayer is unable to detect the presence of subtitle tracks in some
MPEG-TS files that don't fully declare them. It's possible for a
developer to provide the list instead, but doing so is quite awkward
without this helper method. This is consistent for how
`DefaultExtractorsFactory` allows other aspects of the delegate
`Extractor` implementations to be customised.

* Issue: google/ExoPlayer#10175
* Issue: google/ExoPlayer#10505

#minor-release

PiperOrigin-RevId: 490214619
(cherry picked from commit ff48faec)
parent fa6b8fe0
...@@ -22,6 +22,7 @@ import android.net.Uri; ...@@ -22,6 +22,7 @@ import android.net.Uri;
import androidx.annotation.GuardedBy; import androidx.annotation.GuardedBy;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.FileTypes; import androidx.media3.common.FileTypes;
import androidx.media3.common.Format;
import androidx.media3.common.PlaybackException; import androidx.media3.common.PlaybackException;
import androidx.media3.common.Player; import androidx.media3.common.Player;
import androidx.media3.common.util.TimestampAdjuster; import androidx.media3.common.util.TimestampAdjuster;
...@@ -44,6 +45,7 @@ import androidx.media3.extractor.ts.PsExtractor; ...@@ -44,6 +45,7 @@ import androidx.media3.extractor.ts.PsExtractor;
import androidx.media3.extractor.ts.TsExtractor; import androidx.media3.extractor.ts.TsExtractor;
import androidx.media3.extractor.ts.TsPayloadReader; import androidx.media3.extractor.ts.TsPayloadReader;
import androidx.media3.extractor.wav.WavExtractor; import androidx.media3.extractor.wav.WavExtractor;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
...@@ -128,11 +130,13 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { ...@@ -128,11 +130,13 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
private @Mp3Extractor.Flags int mp3Flags; private @Mp3Extractor.Flags int mp3Flags;
private @TsExtractor.Mode int tsMode; private @TsExtractor.Mode int tsMode;
private @DefaultTsPayloadReaderFactory.Flags int tsFlags; private @DefaultTsPayloadReaderFactory.Flags int tsFlags;
private ImmutableList<Format> tsSubtitleFormats;
private int tsTimestampSearchBytes; private int tsTimestampSearchBytes;
public DefaultExtractorsFactory() { public DefaultExtractorsFactory() {
tsMode = TsExtractor.MODE_SINGLE_PMT; tsMode = TsExtractor.MODE_SINGLE_PMT;
tsTimestampSearchBytes = TsExtractor.DEFAULT_TIMESTAMP_SEARCH_BYTES; tsTimestampSearchBytes = TsExtractor.DEFAULT_TIMESTAMP_SEARCH_BYTES;
tsSubtitleFormats = ImmutableList.of();
} }
/** /**
...@@ -304,6 +308,20 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { ...@@ -304,6 +308,20 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
} }
/** /**
* Sets a list of subtitle formats to pass to the {@link DefaultTsPayloadReaderFactory} used by
* {@link TsExtractor} instances created by the factory.
*
* @see DefaultTsPayloadReaderFactory#DefaultTsPayloadReaderFactory(int, List)
* @param subtitleFormats The subtitle formats.
* @return The factory, for convenience.
*/
@CanIgnoreReturnValue
public synchronized DefaultExtractorsFactory setTsSubtitleFormats(List<Format> subtitleFormats) {
tsSubtitleFormats = ImmutableList.copyOf(subtitleFormats);
return this;
}
/**
* Sets the number of bytes searched to find a timestamp for {@link TsExtractor} instances created * Sets the number of bytes searched to find a timestamp for {@link TsExtractor} instances created
* by the factory. * by the factory.
* *
...@@ -416,7 +434,12 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { ...@@ -416,7 +434,12 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
extractors.add(new PsExtractor()); extractors.add(new PsExtractor());
break; break;
case FileTypes.TS: case FileTypes.TS:
extractors.add(new TsExtractor(tsMode, tsFlags, tsTimestampSearchBytes)); extractors.add(
new TsExtractor(
tsMode,
new TimestampAdjuster(0),
new DefaultTsPayloadReaderFactory(tsFlags, tsSubtitleFormats),
tsTimestampSearchBytes));
break; break;
case FileTypes.WAV: case FileTypes.WAV:
extractors.add(new WavExtractor()); extractors.add(new WavExtractor());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment