From 7c33e2570afc1c68c6e58e1d332e836f744b6036 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 3 Jun 2020 13:28:51 +0100 Subject: [PATCH] Update getFormatFromExtension to take a URI This allows to handle the last segment retrieval and process the case where the filename is null in the method. PiperOrigin-RevId: 314512974 --- .../android/exoplayer2/util/FilenameUtil.java | 11 ++++++--- .../exoplayer2/util/FilenameUtilTest.java | 23 +++++++++++++++---- .../extractor/DefaultExtractorsFactory.java | 5 +--- .../hls/DefaultHlsExtractorFactory.java | 6 +---- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/FilenameUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/FilenameUtil.java index 234d855c4e..614f58e94b 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/FilenameUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/FilenameUtil.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.util; +import android.net.Uri; import androidx.annotation.IntDef; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -112,11 +113,15 @@ public final class FilenameUtil { private FilenameUtil() {} /** - * Returns the {@link FileFormat} corresponding to the extension of the provided {@code filename}. + * Returns the {@link FileFormat} corresponding to the filename extension of the provided {@link + * Uri}. The filename is considered to be the last segment of the {@link Uri} path. */ @FileFormat - public static int getFormatFromExtension(String filename) { - if (filename.endsWith(FILE_EXTENSION_AC3) || filename.endsWith(FILE_EXTENSION_EC3)) { + public static int getFormatFromExtension(Uri uri) { + String filename = uri.getLastPathSegment(); + if (filename == null) { + return FILE_FORMAT_UNKNOWN; + } else if (filename.endsWith(FILE_EXTENSION_AC3) || filename.endsWith(FILE_EXTENSION_EC3)) { return FILE_FORMAT_AC3; } else if (filename.endsWith(FILE_EXTENSION_AC4)) { return FILE_FORMAT_AC4; diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/FilenameUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/FilenameUtilTest.java index 89270e0f33..d3849356f3 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/FilenameUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/FilenameUtilTest.java @@ -21,6 +21,7 @@ import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_UNKNOW import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension; import static com.google.common.truth.Truth.assertThat; +import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,16 +32,30 @@ public class FilenameUtilTest { @Test public void getFormatFromExtension_withExtension_returnsExpectedFormat() { - assertThat(getFormatFromExtension("filename.mp3")).isEqualTo(FILE_FORMAT_MP3); + assertThat(getFormatFromExtension(Uri.parse("filename.mp3"))).isEqualTo(FILE_FORMAT_MP3); } @Test public void getFormatFromExtension_withExtensionPrefix_returnsExpectedFormat() { - assertThat(getFormatFromExtension("filename.mka")).isEqualTo(FILE_FORMAT_MATROSKA); + assertThat(getFormatFromExtension(Uri.parse("filename.mka"))).isEqualTo(FILE_FORMAT_MATROSKA); } @Test - public void getFormatFromExtension_unknownExtension_returnsUnknownFormat() { - assertThat(getFormatFromExtension("filename.unknown")).isEqualTo(FILE_FORMAT_UNKNOWN); + public void getFormatFromExtension_withUnknownExtension_returnsUnknownFormat() { + assertThat(getFormatFromExtension(Uri.parse("filename.unknown"))) + .isEqualTo(FILE_FORMAT_UNKNOWN); + } + + @Test + public void getFormatFromExtension_withUriNotEndingWithFilename_returnsExpectedFormat() { + assertThat( + getFormatFromExtension( + Uri.parse("http://www.example.com/filename.mp3?query=myquery#fragment"))) + .isEqualTo(FILE_FORMAT_MP3); + } + + @Test + public void getFormatFromExtension_withNullFilename_returnsUnknownFormat() { + assertThat(getFormatFromExtension(Uri.EMPTY)).isEqualTo(FILE_FORMAT_UNKNOWN); } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java index 6f620c319e..431b96a5ea 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java @@ -27,7 +27,6 @@ import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_MP4; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_OGG; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_PS; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_TS; -import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_UNKNOWN; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_WAV; import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension; @@ -286,9 +285,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory { public synchronized Extractor[] createExtractors(Uri uri) { List extractors = new ArrayList<>(/* initialCapacity= */ 14); - String filename = uri.getLastPathSegment(); - @FilenameUtil.FileFormat - int extensionFormat = filename == null ? FILE_FORMAT_UNKNOWN : getFormatFromExtension(filename); + @FilenameUtil.FileFormat int extensionFormat = getFormatFromExtension(uri); addExtractorsForFormat(extensionFormat, extractors); for (int format : DEFAULT_EXTRACTOR_ORDER) { diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/DefaultHlsExtractorFactory.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/DefaultHlsExtractorFactory.java index 5df0f88692..010b6e2417 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/DefaultHlsExtractorFactory.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/DefaultHlsExtractorFactory.java @@ -195,11 +195,7 @@ public final class DefaultHlsExtractorFactory implements HlsExtractorFactory { if (MimeTypes.TEXT_VTT.equals(format.sampleMimeType)) { return new WebvttExtractor(format.language, timestampAdjuster); } - String filename = uri.getLastPathSegment(); - if (filename == null) { - return null; - } - @FilenameUtil.FileFormat int fileFormat = getFormatFromExtension(filename); + @FilenameUtil.FileFormat int fileFormat = getFormatFromExtension(uri); switch (fileFormat) { case FILE_FORMAT_WEBVTT: return new WebvttExtractor(format.language, timestampAdjuster);