replace extension with mime type

This change uses mime types in a functionally equivalent way to how we used the extension hint so far.

Using a mimeType instead of the extension has some advantages. Most importantly mimeTypes are used by the cast SDK with which we want to achieve interoperability in the cast extension.

Using a mimeType instead of the extension hint further appears to be a bit more clear (which might be opinionated). Further mime types are a well known and widely used concept to identify file type on the internet and it provides asterix based generalizations (audio/*, */*) which could express the media type OTHER that ExoPlayer is using internally (no usage of asterix required so far though).

PiperOrigin-RevId: 300058945
This commit is contained in:
bachinger 2020-03-10 11:11:48 +00:00 committed by Oliver Woodman
parent 87405cb1c0
commit a5f0eb1e10
9 changed files with 115 additions and 44 deletions

View File

@ -473,9 +473,7 @@ public class PlayerActivity extends AppCompatActivity
@Nullable @Nullable
private MediaSource createLeafMediaSource(UriSample parameters) { private MediaSource createLeafMediaSource(UriSample parameters) {
MediaItem.Builder builder = new MediaItem.Builder().setSourceUri(parameters.uri); MediaItem.Builder builder = new MediaItem.Builder().setSourceUri(parameters.uri);
if (parameters.extension != null) { builder.setMimeType(Sample.inferAdaptiveStreamMimeType(parameters.uri, parameters.extension));
builder.setExtension(parameters.extension);
}
int[] drmSessionForClearTypes = new int[0]; int[] drmSessionForClearTypes = new int[0];
HttpDataSource.Factory drmDataSourceFactory = null; HttpDataSource.Factory drmDataSourceFactory = null;
if (parameters.drmInfo != null) { if (parameters.drmInfo != null) {

View File

@ -35,6 +35,7 @@ import android.net.Uri;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
@ -42,6 +43,31 @@ import java.util.UUID;
/* package */ abstract class Sample { /* package */ abstract class Sample {
/**
* Returns the mime type which is one of {@link MimeTypes#APPLICATION_MPD} for DASH, {@link
* MimeTypes#APPLICATION_M3U8} for HLS, {@link MimeTypes#APPLICATION_SS} for SmoothStreaming or
* {@code null} for all other streams.
*
* @param uri The uri of the stream.
* @param extension The extension
* @return The adaptive mime type or {@code null} for non-adaptive streams.
*/
@Nullable
public static String inferAdaptiveStreamMimeType(Uri uri, @Nullable String extension) {
@C.ContentType int contentType = Util.inferContentType(uri, extension);
switch (contentType) {
case C.TYPE_DASH:
return MimeTypes.APPLICATION_MPD;
case C.TYPE_HLS:
return MimeTypes.APPLICATION_M3U8;
case C.TYPE_SS:
return MimeTypes.APPLICATION_SS;
case C.TYPE_OTHER:
default:
return null;
}
}
public static final class UriSample extends Sample { public static final class UriSample extends Sample {
public static UriSample createFromIntent(Uri uri, Intent intent, String extrasKeySuffix) { public static UriSample createFromIntent(Uri uri, Intent intent, String extrasKeySuffix) {

View File

@ -55,7 +55,7 @@ public final class MediaItem {
@Nullable private String mediaId; @Nullable private String mediaId;
@Nullable private Uri sourceUri; @Nullable private Uri sourceUri;
@Nullable private String extension; @Nullable private String mimeType;
@Nullable private Uri drmLicenseUri; @Nullable private Uri drmLicenseUri;
private Map<String, String> drmLicenseRequestHeaders; private Map<String, String> drmLicenseRequestHeaders;
@Nullable private UUID drmUuid; @Nullable private UUID drmUuid;
@ -70,7 +70,7 @@ public final class MediaItem {
} }
/** /**
* Sets the optional media id which identifies the media item. If not specified, {@code * Sets the optional media id which identifies the media item. If not specified, {@link
* #setSourceUri} must be called and the string representation of {@link * #setSourceUri} must be called and the string representation of {@link
* PlaybackProperties#sourceUri} is used as the media id. * PlaybackProperties#sourceUri} is used as the media id.
*/ */
@ -96,16 +96,17 @@ public final class MediaItem {
} }
/** /**
* Sets the optional extension of the item. * Sets the optional mime type.
* *
* <p>The extension can be used to disambiguate media items that have a uri which does not allow * <p>The mime type may be used as a hint for inferring the type of the media item.
* to infer the actual media type.
* *
* <p>If a {@link PlaybackProperties#sourceUri} is set, the extension is used to create a {@link * <p>If a {@link PlaybackProperties#sourceUri} is set, the mime type is used to create a {@link
* PlaybackProperties} object. Otherwise it will be ignored. * PlaybackProperties} object. Otherwise it will be ignored.
*
* @param mimeType The mime type.
*/ */
public Builder setExtension(@Nullable String extension) { public Builder setMimeType(@Nullable String mimeType) {
this.extension = extension; this.mimeType = mimeType;
return this; return this;
} }
@ -208,7 +209,7 @@ public final class MediaItem {
playbackProperties = playbackProperties =
new PlaybackProperties( new PlaybackProperties(
sourceUri, sourceUri,
extension, mimeType,
drmUuid != null drmUuid != null
? new DrmConfiguration( ? new DrmConfiguration(
drmUuid, drmLicenseUri, drmLicenseRequestHeaders, drmMultiSession) drmUuid, drmLicenseUri, drmLicenseRequestHeaders, drmMultiSession)
@ -291,12 +292,12 @@ public final class MediaItem {
public final Uri sourceUri; public final Uri sourceUri;
/** /**
* The optional extension of the item, or {@code null} if unspecified. * The optional mime type of the item, or {@code null} if unspecified.
* *
* <p>The extension can be used to disambiguate media items that have a uri which does not allow * <p>The mime type can be used to disambiguate media items that have a uri which does not allow
* to infer the actual media type. * to infer the actual media type.
*/ */
@Nullable public final String extension; @Nullable public final String mimeType;
/** Optional {@link DrmConfiguration} for the media. */ /** Optional {@link DrmConfiguration} for the media. */
@Nullable public final DrmConfiguration drmConfiguration; @Nullable public final DrmConfiguration drmConfiguration;
@ -313,12 +314,12 @@ public final class MediaItem {
public PlaybackProperties( public PlaybackProperties(
Uri sourceUri, Uri sourceUri,
@Nullable String extension, @Nullable String mimeType,
@Nullable DrmConfiguration drmConfiguration, @Nullable DrmConfiguration drmConfiguration,
List<StreamKey> streamKeys, List<StreamKey> streamKeys,
@Nullable Object tag) { @Nullable Object tag) {
this.sourceUri = sourceUri; this.sourceUri = sourceUri;
this.extension = extension; this.mimeType = mimeType;
this.drmConfiguration = drmConfiguration; this.drmConfiguration = drmConfiguration;
this.streamKeys = streamKeys; this.streamKeys = streamKeys;
this.tag = tag; this.tag = tag;
@ -335,7 +336,7 @@ public final class MediaItem {
PlaybackProperties other = (PlaybackProperties) obj; PlaybackProperties other = (PlaybackProperties) obj;
return sourceUri.equals(other.sourceUri) return sourceUri.equals(other.sourceUri)
&& Util.areEqual(extension, other.extension) && Util.areEqual(mimeType, other.mimeType)
&& Util.areEqual(drmConfiguration, other.drmConfiguration) && Util.areEqual(drmConfiguration, other.drmConfiguration)
&& Util.areEqual(streamKeys, other.streamKeys) && Util.areEqual(streamKeys, other.streamKeys)
&& Util.areEqual(tag, other.tag); && Util.areEqual(tag, other.tag);
@ -344,7 +345,7 @@ public final class MediaItem {
@Override @Override
public int hashCode() { public int hashCode() {
int result = sourceUri.hashCode(); int result = sourceUri.hashCode();
result = 31 * result + (extension == null ? 0 : extension.hashCode()); result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode());
result = 31 * result + (drmConfiguration == null ? 0 : drmConfiguration.hashCode()); result = 31 * result + (drmConfiguration == null ? 0 : drmConfiguration.hashCode());
result = 31 * result + streamKeys.hashCode(); result = 31 * result + streamKeys.hashCode();
result = 31 * result + (tag == null ? 0 : tag.hashCode()); result = 31 * result + (tag == null ? 0 : tag.hashCode());

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import android.content.Context; import android.content.Context;
import android.net.Uri;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
@ -34,6 +35,7 @@ import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy;
import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource;
import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -47,19 +49,20 @@ import java.util.Map;
* *
* <ul> * <ul>
* <li>{@code DashMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri * <li>{@code DashMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.mpd' or if its {@link MediaItem.PlaybackProperties#extension extension * sourceUri} ends in '.mpd' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType
* field} is explicitly set to 'mpd' (Requires the <a * field} is explicitly set to {@link MimeTypes#APPLICATION_MPD} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-dash module * href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-dash module
* to be added</a> to the app). * to be added</a> to the app).
* <li>{@code HlsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri * <li>{@code HlsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.m3u8' or if its {@link MediaItem.PlaybackProperties#extension * sourceUri} ends in '.m3u8' or if its {@link MediaItem.PlaybackProperties#mimeType mimeType
* extension field} is explicitly set to 'hls' (Requires the <a * field} is explicitly set to {@link MimeTypes#APPLICATION_M3U8} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-hls module to * href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">exoplayer-hls module to
* be added</a> to the app). * be added</a> to the app).
* <li>{@code SsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri * <li>{@code SsMediaSource.Factory} if the item's {@link MediaItem.PlaybackProperties#sourceUri
* sourceUri} ends in '.ism', '.ism/Manifest' or if its {@link * sourceUri} ends in '.ism', '.ism/Manifest' or if its {@link
* MediaItem.PlaybackProperties#extension extension field} is explicitly set to 'ism' * MediaItem.PlaybackProperties#mimeType mimeType field} is explicitly set to {@link
* (Requires the <a href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules"> * MimeTypes#APPLICATION_SS} (Requires the <a
* href="https://exoplayer.dev/hello-world.html#add-exoplayer-modules">
* exoplayer-smoothstreaming module to be added</a> to the app). * exoplayer-smoothstreaming module to be added</a> to the app).
* <li>{@link ProgressiveMediaSource.Factory} serves as a fallback if the item's {@link * <li>{@link ProgressiveMediaSource.Factory} serves as a fallback if the item's {@link
* MediaItem.PlaybackProperties#sourceUri sourceUri} doesn't match one of the above. It tries * MediaItem.PlaybackProperties#sourceUri sourceUri} doesn't match one of the above. It tries
@ -231,8 +234,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
Assertions.checkNotNull(mediaItem.playbackProperties); Assertions.checkNotNull(mediaItem.playbackProperties);
@C.ContentType @C.ContentType
int type = int type =
Util.inferContentType( inferContentType(
mediaItem.playbackProperties.sourceUri, mediaItem.playbackProperties.extension); mediaItem.playbackProperties.sourceUri, mediaItem.playbackProperties.mimeType);
@Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(type); @Nullable MediaSourceFactory mediaSourceFactory = mediaSourceFactories.get(type);
Assertions.checkNotNull( Assertions.checkNotNull(
mediaSourceFactory, "No suitable media source factory found for content type: " + type); mediaSourceFactory, "No suitable media source factory found for content type: " + type);
@ -311,4 +314,20 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
factories.put(C.TYPE_OTHER, new ProgressiveMediaSource.Factory(dataSourceFactory)); factories.put(C.TYPE_OTHER, new ProgressiveMediaSource.Factory(dataSourceFactory));
return factories; return factories;
} }
private static int inferContentType(Uri sourceUri, @Nullable String mimeType) {
if (mimeType == null) {
return Util.inferContentType(sourceUri);
}
switch (mimeType) {
case MimeTypes.APPLICATION_MPD:
return C.TYPE_DASH;
case MimeTypes.APPLICATION_M3U8:
return C.TYPE_HLS;
case MimeTypes.APPLICATION_SS:
return C.TYPE_SS;
default:
return Util.inferContentType(sourceUri);
}
}
} }

View File

@ -21,6 +21,7 @@ import static org.junit.Assert.assertThrows;
import android.net.Uri; import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.util.MimeTypes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -58,18 +59,21 @@ public class MediaItemTest {
} }
@Test @Test
public void builderSetExtension_isNullByDefault() { public void builderSetMimeType_isNullByDefault() {
MediaItem mediaItem = MediaItem.fromUri(URI_STRING); MediaItem mediaItem = MediaItem.fromUri(URI_STRING);
assertThat(mediaItem.playbackProperties.extension).isNull(); assertThat(mediaItem.playbackProperties.mimeType).isNull();
} }
@Test @Test
public void builderSetExtension_setsExtension() { public void builderSetMimeType_setsMimeType() {
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_STRING).setExtension("mpd").build(); new MediaItem.Builder()
.setSourceUri(URI_STRING)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
assertThat(mediaItem.playbackProperties.extension).isEqualTo("mpd"); assertThat(mediaItem.playbackProperties.mimeType).isEqualTo(MimeTypes.APPLICATION_MPD);
} }
@Test @Test

View File

@ -31,11 +31,10 @@ public final class DefaultMediaSourceFactoryTest {
private static final String URI_MEDIA = "http://exoplayer.dev/video"; private static final String URI_MEDIA = "http://exoplayer.dev/video";
@Test @Test
public void createMediaSource_withExtension_progressiveSource() { public void createMediaSource_withoutMimeType_progressiveSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem = new MediaItem.Builder().setSourceUri(URI_MEDIA).build();
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("mp4").build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);

View File

@ -23,6 +23,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MimeTypes;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -33,11 +34,14 @@ public class DefaultMediaSourceFactoryTest {
private static final String URI_MEDIA = "http://exoplayer.dev/video"; private static final String URI_MEDIA = "http://exoplayer.dev/video";
@Test @Test
public void createMediaSource_withExtension_dashSource() { public void createMediaSource_withMimeType_dashSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("mpd").build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_MPD)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
@ -50,7 +54,11 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("mpd").setTag(tag).build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_MPD)
.setTag(tag)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);

View File

@ -23,6 +23,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MimeTypes;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -33,11 +34,14 @@ public class DefaultMediaSourceFactoryTest {
private static final String URI_MEDIA = "http://exoplayer.dev/video"; private static final String URI_MEDIA = "http://exoplayer.dev/video";
@Test @Test
public void createMediaSource_withExtension_hlsSource() { public void createMediaSource_withMimeType_hlsSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("m3u8").build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_M3U8)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
@ -50,7 +54,11 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("m3u8").setTag(tag).build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_M3U8)
.setTag(tag)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);

View File

@ -23,6 +23,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MimeTypes;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -35,11 +36,14 @@ public class DefaultMediaSourceFactoryTest {
private static final String URI_MEDIA = "http://exoplayer.dev/video"; private static final String URI_MEDIA = "http://exoplayer.dev/video";
@Test @Test
public void createMediaSource_withExtension_smoothstreamingSource() { public void createMediaSource_withMimeType_smoothstreamingSource() {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("ism").build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_SS)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);
assertThat(mediaSource).isInstanceOf(SsMediaSource.class); assertThat(mediaSource).isInstanceOf(SsMediaSource.class);
} }
@ -50,7 +54,11 @@ public class DefaultMediaSourceFactoryTest {
DefaultMediaSourceFactory defaultMediaSourceFactory = DefaultMediaSourceFactory defaultMediaSourceFactory =
DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext()); DefaultMediaSourceFactory.newInstance(ApplicationProvider.getApplicationContext());
MediaItem mediaItem = MediaItem mediaItem =
new MediaItem.Builder().setSourceUri(URI_MEDIA).setExtension("ism").setTag(tag).build(); new MediaItem.Builder()
.setSourceUri(URI_MEDIA)
.setMimeType(MimeTypes.APPLICATION_SS)
.setTag(tag)
.build();
MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem); MediaSource mediaSource = defaultMediaSourceFactory.createMediaSource(mediaItem);