diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsExtractorFactory.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsExtractorFactory.java index 2f4e832c75..7e301fe2f9 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsExtractorFactory.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsExtractorFactory.java @@ -36,7 +36,12 @@ import java.util.Map; @UnstableApi public interface HlsExtractorFactory { - HlsExtractorFactory DEFAULT = new DefaultHlsExtractorFactory(); + /** + * @deprecated {@code HlsExtractorFactory} instances are mutable, so sharing one in a static field + * is not safe. Construct a new instance of {@link DefaultHlsExtractorFactory} for each usage + * instead. + */ + @Deprecated HlsExtractorFactory DEFAULT = new DefaultHlsExtractorFactory(); /** * Creates an {@link Extractor} for extracting HLS media chunks. diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java index be597fe46f..7985d7211a 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java @@ -105,7 +105,9 @@ public final class HlsMediaSource extends BaseMediaSource private final HlsDataSourceFactory hlsDataSourceFactory; - private HlsExtractorFactory extractorFactory; + @Nullable private HlsExtractorFactory extractorFactory; + @Nullable private SubtitleParser.Factory subtitleParserFactoryOverride; + private boolean parseSubtitlesDuringExtraction; private HlsPlaylistParserFactory playlistParserFactory; private HlsPlaylistTracker.Factory playlistTrackerFactory; private CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory; @@ -128,7 +130,7 @@ public final class HlsMediaSource extends BaseMediaSource *
Any values passed to {@link #setSubtitleParserFactory} or {@link
+ * #experimentalParseSubtitlesDuringExtraction} will be forwarded to the provided {@link
+ * HlsExtractorFactory} instance during {@link #createMediaSource}.
*
* @param extractorFactory An {@link HlsExtractorFactory} for {@link Extractor}s for the
* segments.
@@ -182,8 +187,7 @@ public final class HlsMediaSource extends BaseMediaSource
*/
@CanIgnoreReturnValue
public Factory setExtractorFactory(@Nullable HlsExtractorFactory extractorFactory) {
- this.extractorFactory =
- extractorFactory != null ? extractorFactory : HlsExtractorFactory.DEFAULT;
+ this.extractorFactory = extractorFactory;
return this;
}
@@ -202,7 +206,7 @@ public final class HlsMediaSource extends BaseMediaSource
@CanIgnoreReturnValue
@Override
public Factory setSubtitleParserFactory(SubtitleParser.Factory subtitleParserFactory) {
- extractorFactory.setSubtitleParserFactory(checkNotNull(subtitleParserFactory));
+ this.subtitleParserFactoryOverride = subtitleParserFactory;
return this;
}
@@ -211,7 +215,7 @@ public final class HlsMediaSource extends BaseMediaSource
@CanIgnoreReturnValue
public Factory experimentalParseSubtitlesDuringExtraction(
boolean parseSubtitlesDuringExtraction) {
- extractorFactory.experimentalParseSubtitlesDuringExtraction(parseSubtitlesDuringExtraction);
+ this.parseSubtitlesDuringExtraction = parseSubtitlesDuringExtraction;
return this;
}
@@ -384,6 +388,14 @@ public final class HlsMediaSource extends BaseMediaSource
@Override
public HlsMediaSource createMediaSource(MediaItem mediaItem) {
checkNotNull(mediaItem.localConfiguration);
+ if (extractorFactory == null) {
+ extractorFactory = new DefaultHlsExtractorFactory();
+ }
+ if (subtitleParserFactoryOverride != null) {
+ extractorFactory.setSubtitleParserFactory(subtitleParserFactoryOverride);
+ }
+ extractorFactory.experimentalParseSubtitlesDuringExtraction(parseSubtitlesDuringExtraction);
+ HlsExtractorFactory extractorFactory = this.extractorFactory;
HlsPlaylistParserFactory playlistParserFactory = this.playlistParserFactory;
List