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 64afcd393a..d6dd67ee7d 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 @@ -250,16 +250,37 @@ public final class MimeTypes { */ public static boolean containsCodecsCorrespondingToMimeType( @Nullable String codecs, String mimeType) { - if (codecs == null) { - return false; + return getCodecsCorrespondingToMimeType(codecs, mimeType) != null; + } + + /** + * Returns a subsequence of {@code codecs} containing the codec strings that correspond to the + * given {@code mimeType}. Returns null if {@code mimeType} is null, {@code codecs} is null, or + * {@code codecs} does not contain a codec that corresponds to {@code mimeType}. + * + * @param codecs An RFC 6381 codecs string. + * @param mimeType A MIME type to look for. + * @return A subsequence of {@code codecs} containing the codec strings that correspond to the + * given {@code mimeType}. Returns null if {@code mimeType} is null, {@code codecs} is null, + * or {@code codecs} does not contain a codec that corresponds to {@code mimeType}. + */ + @Nullable + public static String getCodecsCorrespondingToMimeType( + @Nullable String codecs, @Nullable String mimeType) { + if (codecs == null || mimeType == null) { + return null; } String[] codecList = Util.splitCodecs(codecs); + StringBuilder builder = new StringBuilder(); for (String codec : codecList) { if (mimeType.equals(getMediaMimeType(codec))) { - return true; + if (builder.length() > 0) { + builder.append(","); + } + builder.append(codec); } } - return false; + return builder.length() > 0 ? builder.toString() : null; } /** diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java index 6f68328dc7..2baac87e85 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/MimeTypesTest.java @@ -60,6 +60,37 @@ public final class MimeTypesTest { .isFalse(); } + @Test + public void getCodecsCorrespondingToMimeType_returnsCorrectResult() { + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AAC)) + .isEqualTo("mp4a.40.2"); + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.VIDEO_H264)) + .isEqualTo("avc1.4D5015,avc1.4D4015"); + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AC3)) + .isEqualTo("ac-3"); + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "unknown-codec,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AC3)) + .isEqualTo("ac-3"); + + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.VIDEO_H265)) + .isNull(); + assertThat( + MimeTypes.getCodecsCorrespondingToMimeType( + /* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", null)) + .isNull(); + assertThat(MimeTypes.getCodecsCorrespondingToMimeType(/* codecs= */ null, MimeTypes.AUDIO_AAC)) + .isNull(); + } + @Test public void isText_returnsCorrectResult() { assertThat(MimeTypes.isText(MimeTypes.TEXT_VTT)).isTrue(); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 89e7687a21..7f1af4496f 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -1404,8 +1404,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return sampleFormat; } - int sampleTrackType = MimeTypes.getTrackType(sampleFormat.sampleMimeType); - @Nullable String codecs = Util.getCodecsOfType(playlistFormat.codecs, sampleTrackType); + @Nullable + String codecs = + MimeTypes.getCodecsCorrespondingToMimeType( + playlistFormat.codecs, sampleFormat.sampleMimeType); @Nullable String sampleMimeType = MimeTypes.getMediaMimeType(codecs); Format.Builder formatBuilder =