From e0a9540cd3959b8244def9644db26488927da166 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 21 Sep 2021 17:16:46 +0100 Subject: [PATCH] Mark MediaItem.Subtitle.mimeType as @Nullable The MIME type is currently required to select a SubtitleDecoder implementation in the TextRenderer. Future changes might remove this requirement, so we pre-emptively mark the field as @Nullable. The change in SingleSampleMediaSource ensures the track still maps to the TextRenderer, otherwise it shows up as unmapped. Passing null MIME type to MediaItem.Subtitle constructor now results in this from EventLogger: TextRenderer [ Group:0, adaptive_supported=N/A [ [ ] Track:0, id=null, mimeType=text/x-unknown, language=en, supported=NO_UNSUPPORTED_TYPE ] ] PiperOrigin-RevId: 398010809 --- .../java/com/google/android/exoplayer2/MediaItem.java | 8 ++++---- .../com/google/android/exoplayer2/util/MimeTypes.java | 2 ++ .../exoplayer2/source/DefaultMediaSourceFactory.java | 2 +- .../exoplayer2/source/SingleSampleMediaSource.java | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java index ce6adde1b8..f891bb9662 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java @@ -1189,8 +1189,8 @@ public final class MediaItem implements Bundleable { /** The {@link Uri} to the subtitle file. */ public final Uri uri; - /** The MIME type. */ - public final String mimeType; + /** The optional MIME type of the subtitle file, or {@code null} if unspecified. */ + @Nullable public final String mimeType; /** The language. */ @Nullable public final String language; /** The selection flags. */ @@ -1261,7 +1261,7 @@ public final class MediaItem implements Bundleable { Subtitle other = (Subtitle) obj; return uri.equals(other.uri) - && mimeType.equals(other.mimeType) + && Util.areEqual(mimeType, other.mimeType) && Util.areEqual(language, other.language) && selectionFlags == other.selectionFlags && roleFlags == other.roleFlags @@ -1271,7 +1271,7 @@ public final class MediaItem implements Bundleable { @Override public int hashCode() { int result = uri.hashCode(); - result = 31 * result + mimeType.hashCode(); + result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode()); result = 31 * result + (language == null ? 0 : language.hashCode()); result = 31 * result + selectionFlags; result = 31 * result + roleFlags; diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java index 3e82accd71..493485133a 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java @@ -98,6 +98,8 @@ public final class MimeTypes { public static final String TEXT_EXOPLAYER_CUES = BASE_TYPE_TEXT + "/x-exoplayer-cues"; + public static final String TEXT_UNKNOWN = BASE_TYPE_TEXT + "/x-unknown"; + // application/ MIME types public static final String APPLICATION_MP4 = BASE_TYPE_APPLICATION + "/mp4"; 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 72039bce80..a5ffff4998 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 @@ -381,7 +381,7 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { mediaSources[0] = mediaSource; for (int i = 0; i < subtitles.size(); i++) { if (useProgressiveMediaSourceForSubtitles - && subtitles.get(i).mimeType.equals(MimeTypes.TEXT_VTT)) { + && MimeTypes.TEXT_VTT.equals(subtitles.get(i).mimeType)) { int index = i; ProgressiveMediaSource.Factory progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory( 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 c0d34d0ff3..887ce26463 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 @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.source; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.common.base.MoreObjects.firstNonNull; import android.net.Uri; import androidx.annotation.Nullable; @@ -28,6 +29,7 @@ import com.google.android.exoplayer2.upstream.DataSpec; 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; /** @@ -163,7 +165,7 @@ public final class SingleSampleMediaSource extends BaseMediaSource { format = new Format.Builder() .setId(trackId) - .setSampleMimeType(subtitle.mimeType) + .setSampleMimeType(firstNonNull(subtitle.mimeType, MimeTypes.TEXT_UNKNOWN)) .setLanguage(subtitle.language) .setSelectionFlags(subtitle.selectionFlags) .setRoleFlags(subtitle.roleFlags)