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:
parent
87405cb1c0
commit
a5f0eb1e10
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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());
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user