mirror of
https://github.com/samsonjs/media.git
synced 2026-04-14 12:45:47 +00:00
DASH: Set MIME, width and height for image adaptation sets
Issue: #9500 PiperOrigin-RevId: 401091261
This commit is contained in:
parent
03ff5b6618
commit
585b0bddcc
6 changed files with 76 additions and 0 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
11
testdata/src/test/assets/media/mpd/sample_mpd_images
vendored
Normal file
11
testdata/src/test/assets/media/mpd/sample_mpd_images
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?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>
|
||||
Loading…
Reference in a new issue