diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 15c365bdad..71ad113ff9 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -196,12 +196,13 @@ public class IntentUtil { if (localConfiguration.drmConfiguration != null) { addDrmConfigurationToIntent(localConfiguration.drmConfiguration, intent, extrasKeySuffix); } - if (!localConfiguration.subtitles.isEmpty()) { - checkState(localConfiguration.subtitles.size() == 1); - MediaItem.Subtitle subtitle = localConfiguration.subtitles.get(0); - intent.putExtra(SUBTITLE_URI_EXTRA + extrasKeySuffix, subtitle.uri.toString()); - intent.putExtra(SUBTITLE_MIME_TYPE_EXTRA + extrasKeySuffix, subtitle.mimeType); - intent.putExtra(SUBTITLE_LANGUAGE_EXTRA + extrasKeySuffix, subtitle.language); + if (!localConfiguration.subtitleConfigurations.isEmpty()) { + checkState(localConfiguration.subtitleConfigurations.size() == 1); + MediaItem.SubtitleConfiguration subtitleConfiguration = + localConfiguration.subtitleConfigurations.get(0); + intent.putExtra(SUBTITLE_URI_EXTRA + extrasKeySuffix, subtitleConfiguration.uri.toString()); + intent.putExtra(SUBTITLE_MIME_TYPE_EXTRA + extrasKeySuffix, subtitleConfiguration.mimeType); + intent.putExtra(SUBTITLE_LANGUAGE_EXTRA + extrasKeySuffix, subtitleConfiguration.language); } } diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index 8520fff8c9..e5bd28aca2 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -233,8 +233,8 @@ public final class Util { if (isLocalFileUri(mediaItem.localConfiguration.uri)) { return requestExternalStoragePermission(activity); } - for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { - if (isLocalFileUri(mediaItem.localConfiguration.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { + if (isLocalFileUri(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { return requestExternalStoragePermission(activity); } } @@ -261,8 +261,8 @@ public final class Util { if (isTrafficRestricted(mediaItem.localConfiguration.uri)) { return false; } - for (int i = 0; i < mediaItem.localConfiguration.subtitles.size(); i++) { - if (isTrafficRestricted(mediaItem.localConfiguration.subtitles.get(i).uri)) { + for (int i = 0; i < mediaItem.localConfiguration.subtitleConfigurations.size(); i++) { + if (isTrafficRestricted(mediaItem.localConfiguration.subtitleConfigurations.get(i).uri)) { return false; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index bdba5330c1..a216e3ad82 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -173,8 +173,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { /** * Sets whether a {@link ProgressiveMediaSource} or {@link SingleSampleMediaSource} is constructed - * to handle {@link MediaItem.LocalConfiguration#subtitles}. Defaults to false (i.e. {@link - * SingleSampleMediaSource}. + * to handle {@link MediaItem.LocalConfiguration#subtitleConfigurations}. Defaults to false (i.e. + * {@link SingleSampleMediaSource}. * *

This method is experimental, and will be renamed or removed in a future release. * @@ -375,13 +375,14 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { MediaSource mediaSource = mediaSourceFactory.createMediaSource(mediaItem); - List subtitles = castNonNull(mediaItem.localConfiguration).subtitles; - if (!subtitles.isEmpty()) { - MediaSource[] mediaSources = new MediaSource[subtitles.size() + 1]; + List subtitleConfigurations = + castNonNull(mediaItem.localConfiguration).subtitleConfigurations; + if (!subtitleConfigurations.isEmpty()) { + MediaSource[] mediaSources = new MediaSource[subtitleConfigurations.size() + 1]; mediaSources[0] = mediaSource; - for (int i = 0; i < subtitles.size(); i++) { + for (int i = 0; i < subtitleConfigurations.size(); i++) { if (useProgressiveMediaSourceForSubtitles - && MimeTypes.TEXT_VTT.equals(subtitles.get(i).mimeType)) { + && MimeTypes.TEXT_VTT.equals(subtitleConfigurations.get(i).mimeType)) { int index = i; ProgressiveMediaSource.Factory progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory( @@ -391,23 +392,23 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { new SubtitleExtractor( new WebvttDecoder(), new Format.Builder() - .setSampleMimeType(subtitles.get(index).mimeType) - .setLanguage(subtitles.get(index).language) - .setSelectionFlags(subtitles.get(index).selectionFlags) - .setRoleFlags(subtitles.get(index).roleFlags) - .setLabel(subtitles.get(index).label) + .setSampleMimeType(subtitleConfigurations.get(index).mimeType) + .setLanguage(subtitleConfigurations.get(index).language) + .setSelectionFlags(subtitleConfigurations.get(index).selectionFlags) + .setRoleFlags(subtitleConfigurations.get(index).roleFlags) + .setLabel(subtitleConfigurations.get(index).label) .build()) }); mediaSources[i + 1] = progressiveMediaSourceFactory.createMediaSource( - MediaItem.fromUri(subtitles.get(i).uri.toString())); + MediaItem.fromUri(subtitleConfigurations.get(i).uri.toString())); } else { SingleSampleMediaSource.Factory singleSampleSourceFactory = new SingleSampleMediaSource.Factory(dataSourceFactory) .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); mediaSources[i + 1] = singleSampleSourceFactory.createMediaSource( - subtitles.get(i), /* durationUs= */ C.TIME_UNSET); + subtitleConfigurations.get(i), /* durationUs= */ C.TIME_UNSET); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 607f4208d1..e5cb2bb976 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -30,7 +30,7 @@ import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.MimeTypes; -import java.util.Collections; +import com.google.common.collect.ImmutableList; /** * Loads data at a given {@link Uri} as a single sample belonging to a single {@link MediaPeriod}. @@ -115,14 +115,15 @@ public final class SingleSampleMediaSource extends BaseMediaSource { /** * Returns a new {@link SingleSampleMediaSource} using the current parameters. * - * @param subtitle The {@link MediaItem.Subtitle}. + * @param subtitleConfiguration The {@link MediaItem.SubtitleConfiguration}. * @param durationUs The duration of the media stream in microseconds. * @return The new {@link SingleSampleMediaSource}. */ - public SingleSampleMediaSource createMediaSource(MediaItem.Subtitle subtitle, long durationUs) { + public SingleSampleMediaSource createMediaSource( + MediaItem.SubtitleConfiguration subtitleConfiguration, long durationUs) { return new SingleSampleMediaSource( trackId, - subtitle, + subtitleConfiguration, dataSourceFactory, durationUs, loadErrorHandlingPolicy, @@ -144,7 +145,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { private SingleSampleMediaSource( @Nullable String trackId, - MediaItem.Subtitle subtitle, + MediaItem.SubtitleConfiguration subtitleConfiguration, DataSource.Factory dataSourceFactory, long durationUs, LoadErrorHandlingPolicy loadErrorHandlingPolicy, @@ -157,21 +158,24 @@ public final class SingleSampleMediaSource extends BaseMediaSource { mediaItem = new MediaItem.Builder() .setUri(Uri.EMPTY) - .setMediaId(subtitle.uri.toString()) - .setSubtitles(Collections.singletonList(subtitle)) + .setMediaId(subtitleConfiguration.uri.toString()) + .setSubtitleConfigurations(ImmutableList.of(subtitleConfiguration)) .setTag(tag) .build(); format = new Format.Builder() .setId(trackId) - .setSampleMimeType(firstNonNull(subtitle.mimeType, MimeTypes.TEXT_UNKNOWN)) - .setLanguage(subtitle.language) - .setSelectionFlags(subtitle.selectionFlags) - .setRoleFlags(subtitle.roleFlags) - .setLabel(subtitle.label) + .setSampleMimeType(firstNonNull(subtitleConfiguration.mimeType, MimeTypes.TEXT_UNKNOWN)) + .setLanguage(subtitleConfiguration.language) + .setSelectionFlags(subtitleConfiguration.selectionFlags) + .setRoleFlags(subtitleConfiguration.roleFlags) + .setLabel(subtitleConfiguration.label) .build(); dataSpec = - new DataSpec.Builder().setUri(subtitle.uri).setFlags(DataSpec.FLAG_ALLOW_GZIP).build(); + new DataSpec.Builder() + .setUri(subtitleConfiguration.uri) + .setFlags(DataSpec.FLAG_ALLOW_GZIP) + .build(); timeline = new SinglePeriodTimeline( durationUs,