From 585b0bddcc965e269ad9eb8810b6f8da2b062996 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 5 Oct 2021 23:55:06 +0100 Subject: [PATCH] DASH: Set MIME, width and height for image adaptation sets Issue: #9500 PiperOrigin-RevId: 401091261 --- RELEASENOTES.md | 4 +++ .../android/exoplayer2/util/MimeTypes.java | 7 +++++ .../exoplayer2/util/MimeTypesTest.java | 31 +++++++++++++++++++ .../dash/manifest/DashManifestParser.java | 5 +++ .../dash/manifest/DashManifestParserTest.java | 18 +++++++++++ .../test/assets/media/mpd/sample_mpd_images | 11 +++++++ 6 files changed, 76 insertions(+) create mode 100644 testdata/src/test/assets/media/mpd/sample_mpd_images diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c376d3165d..4dd7187546 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -57,6 +57,10 @@ * RTSP: * Support RFC4566 SDP attribute field grammar ([#9430](https://github.com/google/ExoPlayer/issues/9430)). +* DASH: + * Populate `Format.sampleMimeType`, `width` and `height` for image + `AdaptationSet` elements + ([#9500](https://github.com/google/ExoPlayer/issues/9500)). * Remove deprecated symbols: * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named constants in `C` instead. 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 493485133a..75c1b94566 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 @@ -201,6 +201,11 @@ public final class MimeTypes { || APPLICATION_DVBSUBS.equals(mimeType); } + /** Returns whether the given string is an image MIME type. */ + public static boolean isImage(@Nullable String mimeType) { + return BASE_TYPE_IMAGE.equals(getTopLevelType(mimeType)); + } + /** * Returns true if it is known that all samples in a stream of the given MIME type and codec are * guaranteed to be sync samples (i.e., {@link C#BUFFER_FLAG_KEY_FRAME} is guaranteed to be set on @@ -505,6 +510,8 @@ public final class MimeTypes { return C.TRACK_TYPE_VIDEO; } else if (isText(mimeType)) { return C.TRACK_TYPE_TEXT; + } else if (isImage(mimeType)) { + return C.TRACK_TYPE_IMAGE; } else if (APPLICATION_ID3.equals(mimeType) || APPLICATION_EMSG.equals(mimeType) || APPLICATION_SCTE35.equals(mimeType)) { 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 3309c972c4..4e185273d7 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 @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; @@ -114,6 +115,36 @@ public final class MimeTypesTest { assertThat(MimeTypes.isText("application/custom")).isFalse(); } + @Test + public void isImage_returnsCorrectResult() { + assertThat(MimeTypes.isImage(MimeTypes.IMAGE_JPEG)).isTrue(); + assertThat(MimeTypes.isImage("image/custom")).isTrue(); + + assertThat(MimeTypes.isImage(MimeTypes.VIDEO_MP4)).isFalse(); + assertThat(MimeTypes.isImage("application/custom")).isFalse(); + } + + @Test + public void getTrackType_returnsCorrectResult() { + assertThat(MimeTypes.getTrackType(MimeTypes.VIDEO_H264)).isEqualTo(C.TRACK_TYPE_VIDEO); + assertThat(MimeTypes.getTrackType("video/custom")).isEqualTo(C.TRACK_TYPE_VIDEO); + + assertThat(MimeTypes.getTrackType(MimeTypes.AUDIO_AAC)).isEqualTo(C.TRACK_TYPE_AUDIO); + assertThat(MimeTypes.getTrackType("audio/custom")).isEqualTo(C.TRACK_TYPE_AUDIO); + + assertThat(MimeTypes.getTrackType(MimeTypes.TEXT_SSA)).isEqualTo(C.TRACK_TYPE_TEXT); + assertThat(MimeTypes.getTrackType("text/custom")).isEqualTo(C.TRACK_TYPE_TEXT); + + assertThat(MimeTypes.getTrackType(MimeTypes.IMAGE_JPEG)).isEqualTo(C.TRACK_TYPE_IMAGE); + assertThat(MimeTypes.getTrackType("image/custom")).isEqualTo(C.TRACK_TYPE_IMAGE); + + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_CEA608)).isEqualTo(C.TRACK_TYPE_TEXT); + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_EMSG)).isEqualTo(C.TRACK_TYPE_METADATA); + assertThat(MimeTypes.getTrackType(MimeTypes.APPLICATION_CAMERA_MOTION)) + .isEqualTo(C.TRACK_TYPE_CAMERA_MOTION); + assertThat(MimeTypes.getTrackType("application/custom")).isEqualTo(C.TRACK_TYPE_UNKNOWN); + } + @Test public void getMediaMimeType_fromValidCodecs_returnsCorrectMimeType() { assertThat(MimeTypes.getMediaMimeType("avc1")).isEqualTo(MimeTypes.VIDEO_H264); diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java index 9cff83646c..91bf3b2eca 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java @@ -807,6 +807,8 @@ public class DashManifestParser extends DefaultHandler accessibilityChannel = parseCea708AccessibilityChannel(accessibilityDescriptors); } formatBuilder.setAccessibilityChannel(accessibilityChannel); + } else if (MimeTypes.isImage(sampleMimeType)) { + formatBuilder.setWidth(width).setHeight(height); } return formatBuilder.build(); @@ -1635,6 +1637,9 @@ public class DashManifestParser extends DefaultHandler } // All other text types are raw formats. return containerMimeType; + } else if (MimeTypes.isImage(containerMimeType)) { + // Image types are raw formats. + return containerMimeType; } else if (MimeTypes.APPLICATION_MP4.equals(containerMimeType)) { @Nullable String mimeType = MimeTypes.getMediaMimeType(codecs); return MimeTypes.TEXT_VTT.equals(mimeType) ? MimeTypes.APPLICATION_MP4VTT : mimeType; diff --git a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java index dc70713469..ce2961dd2e 100644 --- a/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java +++ b/library/dash/src/test/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParserTest.java @@ -48,6 +48,7 @@ public class DashManifestParserTest { "media/mpd/sample_mpd_unknown_mime_type"; private static final String SAMPLE_MPD_SEGMENT_TEMPLATE = "media/mpd/sample_mpd_segment_template"; private static final String SAMPLE_MPD_EVENT_STREAM = "media/mpd/sample_mpd_event_stream"; + private static final String SAMPLE_MPD_IMAGES = "media/mpd/sample_mpd_images"; private static final String SAMPLE_MPD_LABELS = "media/mpd/sample_mpd_labels"; private static final String SAMPLE_MPD_ASSET_IDENTIFIER = "media/mpd/sample_mpd_asset_identifier"; private static final String SAMPLE_MPD_TEXT = "media/mpd/sample_mpd_text"; @@ -192,6 +193,23 @@ public class DashManifestParserTest { assertThat(manifest.programInformation).isEqualTo(expectedProgramInformation); } + @Test + public void parseMediaPresentationDescription_images() throws IOException { + DashManifestParser parser = new DashManifestParser(); + DashManifest manifest = + parser.parse( + Uri.parse("https://example.com/test.mpd"), + TestUtil.getInputStream( + ApplicationProvider.getApplicationContext(), SAMPLE_MPD_IMAGES)); + + AdaptationSet adaptationSet = manifest.getPeriod(0).adaptationSets.get(0); + Format format = adaptationSet.representations.get(0).format; + + assertThat(format.sampleMimeType).isEqualTo("image/jpeg"); + assertThat(format.width).isEqualTo(320); + assertThat(format.height).isEqualTo(180); + } + @Test public void parseMediaPresentationDescription_labels() throws IOException { DashManifestParser parser = new DashManifestParser(); diff --git a/testdata/src/test/assets/media/mpd/sample_mpd_images b/testdata/src/test/assets/media/mpd/sample_mpd_images new file mode 100644 index 0000000000..981a29a23a --- /dev/null +++ b/testdata/src/test/assets/media/mpd/sample_mpd_images @@ -0,0 +1,11 @@ + + + + + + + + + + +