Commit 585b0bdd by olly Committed by Oliver Woodman

DASH: Set MIME, width and height for image adaptation sets

Issue: #9500
PiperOrigin-RevId: 401091261
parent 03ff5b66
...@@ -57,6 +57,10 @@ ...@@ -57,6 +57,10 @@
* RTSP: * RTSP:
* Support RFC4566 SDP attribute field grammar * Support RFC4566 SDP attribute field grammar
([#9430](https://github.com/google/ExoPlayer/issues/9430)). ([#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 deprecated symbols:
* Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named * Remove `Renderer.VIDEO_SCALING_MODE_*` constants. Use identically named
constants in `C` instead. constants in `C` instead.
......
...@@ -201,6 +201,11 @@ public final class MimeTypes { ...@@ -201,6 +201,11 @@ public final class MimeTypes {
|| APPLICATION_DVBSUBS.equals(mimeType); || 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 * 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 * 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 { ...@@ -505,6 +510,8 @@ public final class MimeTypes {
return C.TRACK_TYPE_VIDEO; return C.TRACK_TYPE_VIDEO;
} else if (isText(mimeType)) { } else if (isText(mimeType)) {
return C.TRACK_TYPE_TEXT; return C.TRACK_TYPE_TEXT;
} else if (isImage(mimeType)) {
return C.TRACK_TYPE_IMAGE;
} else if (APPLICATION_ID3.equals(mimeType) } else if (APPLICATION_ID3.equals(mimeType)
|| APPLICATION_EMSG.equals(mimeType) || APPLICATION_EMSG.equals(mimeType)
|| APPLICATION_SCTE35.equals(mimeType)) { || APPLICATION_SCTE35.equals(mimeType)) {
......
...@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; ...@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -115,6 +116,36 @@ public final class MimeTypesTest { ...@@ -115,6 +116,36 @@ public final class MimeTypesTest {
} }
@Test @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() { public void getMediaMimeType_fromValidCodecs_returnsCorrectMimeType() {
assertThat(MimeTypes.getMediaMimeType("avc1")).isEqualTo(MimeTypes.VIDEO_H264); assertThat(MimeTypes.getMediaMimeType("avc1")).isEqualTo(MimeTypes.VIDEO_H264);
assertThat(MimeTypes.getMediaMimeType("avc1.42E01E")).isEqualTo(MimeTypes.VIDEO_H264); assertThat(MimeTypes.getMediaMimeType("avc1.42E01E")).isEqualTo(MimeTypes.VIDEO_H264);
......
...@@ -807,6 +807,8 @@ public class DashManifestParser extends DefaultHandler ...@@ -807,6 +807,8 @@ public class DashManifestParser extends DefaultHandler
accessibilityChannel = parseCea708AccessibilityChannel(accessibilityDescriptors); accessibilityChannel = parseCea708AccessibilityChannel(accessibilityDescriptors);
} }
formatBuilder.setAccessibilityChannel(accessibilityChannel); formatBuilder.setAccessibilityChannel(accessibilityChannel);
} else if (MimeTypes.isImage(sampleMimeType)) {
formatBuilder.setWidth(width).setHeight(height);
} }
return formatBuilder.build(); return formatBuilder.build();
...@@ -1635,6 +1637,9 @@ public class DashManifestParser extends DefaultHandler ...@@ -1635,6 +1637,9 @@ public class DashManifestParser extends DefaultHandler
} }
// All other text types are raw formats. // All other text types are raw formats.
return containerMimeType; return containerMimeType;
} else if (MimeTypes.isImage(containerMimeType)) {
// Image types are raw formats.
return containerMimeType;
} else if (MimeTypes.APPLICATION_MP4.equals(containerMimeType)) { } else if (MimeTypes.APPLICATION_MP4.equals(containerMimeType)) {
@Nullable String mimeType = MimeTypes.getMediaMimeType(codecs); @Nullable String mimeType = MimeTypes.getMediaMimeType(codecs);
return MimeTypes.TEXT_VTT.equals(mimeType) ? MimeTypes.APPLICATION_MP4VTT : mimeType; return MimeTypes.TEXT_VTT.equals(mimeType) ? MimeTypes.APPLICATION_MP4VTT : mimeType;
......
...@@ -48,6 +48,7 @@ public class DashManifestParserTest { ...@@ -48,6 +48,7 @@ public class DashManifestParserTest {
"media/mpd/sample_mpd_unknown_mime_type"; "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_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_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_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_ASSET_IDENTIFIER = "media/mpd/sample_mpd_asset_identifier";
private static final String SAMPLE_MPD_TEXT = "media/mpd/sample_mpd_text"; private static final String SAMPLE_MPD_TEXT = "media/mpd/sample_mpd_text";
...@@ -193,6 +194,23 @@ public class DashManifestParserTest { ...@@ -193,6 +194,23 @@ public class DashManifestParserTest {
} }
@Test @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 { public void parseMediaPresentationDescription_labels() throws IOException {
DashManifestParser parser = new DashManifestParser(); DashManifestParser parser = new DashManifestParser();
DashManifest manifest = DashManifest manifest =
......
<?xml version="1.0" encoding="UTF-8"?>
<MPD type="static" duration="1s" mediaPresentationDuration="PT1000S">
<Period>
<AdaptationSet id="3" mimeType="image/jpeg" contentType="image">
<SegmentTemplate media="$RepresentationID$/tile_$Number$.jpg" duration="100" startNumber="1"/>
<Representation bandwidth="1234" id="images_320x180" width="320" height="180">
<EssentialProperty schemeIdUri="http://dashif.org/thumbnail_tile" value="title"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment