mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Make MediaParser available for use in progressive media
PiperOrigin-RevId: 358379167
This commit is contained in:
parent
36cbcb30b6
commit
ecb109dad8
5 changed files with 55 additions and 20 deletions
|
|
@ -336,7 +336,7 @@ public final class ExtractorMediaSource extends CompositeMediaSource<Void> {
|
||||||
.setTag(tag)
|
.setTag(tag)
|
||||||
.build(),
|
.build(),
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
extractorsFactory,
|
() -> new BundledExtractorsAdapter(extractorsFactory),
|
||||||
DrmSessionManager.DRM_UNSUPPORTED,
|
DrmSessionManager.DRM_UNSUPPORTED,
|
||||||
loadableLoadErrorHandlingPolicy,
|
loadableLoadErrorHandlingPolicy,
|
||||||
continueLoadingCheckIntervalBytes);
|
continueLoadingCheckIntervalBytes);
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,14 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/** Extracts the contents of a container file from a progressive media stream. */
|
/** Extracts the contents of a container file from a progressive media stream. */
|
||||||
/* package */ interface ProgressiveMediaExtractor {
|
public interface ProgressiveMediaExtractor {
|
||||||
|
|
||||||
|
/** Creates {@link ProgressiveMediaExtractor} instances. */
|
||||||
|
interface Factory {
|
||||||
|
|
||||||
|
/** Returns a new {@link ProgressiveMediaExtractor} instance. */
|
||||||
|
ProgressiveMediaExtractor createProgressiveMediaExtractor();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the underlying infrastructure for reading from the input.
|
* Initializes the underlying infrastructure for reading from the input.
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,6 @@ import com.google.android.exoplayer2.drm.DrmSessionEventListener;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||||
import com.google.android.exoplayer2.extractor.Extractor;
|
import com.google.android.exoplayer2.extractor.Extractor;
|
||||||
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
||||||
import com.google.android.exoplayer2.extractor.ExtractorsFactory;
|
|
||||||
import com.google.android.exoplayer2.extractor.PositionHolder;
|
import com.google.android.exoplayer2.extractor.PositionHolder;
|
||||||
import com.google.android.exoplayer2.extractor.SeekMap;
|
import com.google.android.exoplayer2.extractor.SeekMap;
|
||||||
import com.google.android.exoplayer2.extractor.SeekMap.SeekPoints;
|
import com.google.android.exoplayer2.extractor.SeekMap.SeekPoints;
|
||||||
|
|
@ -147,7 +146,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
/**
|
/**
|
||||||
* @param uri The {@link Uri} of the media stream.
|
* @param uri The {@link Uri} of the media stream.
|
||||||
* @param dataSource The data source to read the media.
|
* @param dataSource The data source to read the media.
|
||||||
* @param extractorsFactory The {@link ExtractorsFactory} to use to read the data source.
|
* @param progressiveMediaExtractor The {@link ProgressiveMediaExtractor} to use to read the data
|
||||||
|
* source.
|
||||||
* @param drmSessionManager A {@link DrmSessionManager} to allow DRM interactions.
|
* @param drmSessionManager A {@link DrmSessionManager} to allow DRM interactions.
|
||||||
* @param drmEventDispatcher A dispatcher to notify of {@link DrmSessionEventListener} events.
|
* @param drmEventDispatcher A dispatcher to notify of {@link DrmSessionEventListener} events.
|
||||||
* @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy}.
|
* @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy}.
|
||||||
|
|
@ -168,7 +168,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
public ProgressiveMediaPeriod(
|
public ProgressiveMediaPeriod(
|
||||||
Uri uri,
|
Uri uri,
|
||||||
DataSource dataSource,
|
DataSource dataSource,
|
||||||
ExtractorsFactory extractorsFactory,
|
ProgressiveMediaExtractor progressiveMediaExtractor,
|
||||||
DrmSessionManager drmSessionManager,
|
DrmSessionManager drmSessionManager,
|
||||||
DrmSessionEventListener.EventDispatcher drmEventDispatcher,
|
DrmSessionEventListener.EventDispatcher drmEventDispatcher,
|
||||||
LoadErrorHandlingPolicy loadErrorHandlingPolicy,
|
LoadErrorHandlingPolicy loadErrorHandlingPolicy,
|
||||||
|
|
@ -188,7 +188,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
this.customCacheKey = customCacheKey;
|
this.customCacheKey = customCacheKey;
|
||||||
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
||||||
loader = new Loader("ProgressiveMediaPeriod");
|
loader = new Loader("ProgressiveMediaPeriod");
|
||||||
this.progressiveMediaExtractor = new BundledExtractorsAdapter(extractorsFactory);
|
this.progressiveMediaExtractor = progressiveMediaExtractor;
|
||||||
loadCondition = new ConditionVariable();
|
loadCondition = new ConditionVariable();
|
||||||
maybeFinishPrepareRunnable = this::maybeFinishPrepare;
|
maybeFinishPrepareRunnable = this::maybeFinishPrepare;
|
||||||
onContinueLoadingRequestedRunnable =
|
onContinueLoadingRequestedRunnable =
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
|
|
||||||
private final DataSource.Factory dataSourceFactory;
|
private final DataSource.Factory dataSourceFactory;
|
||||||
|
|
||||||
private ExtractorsFactory extractorsFactory;
|
private ProgressiveMediaExtractor.Factory progressiveMediaExtractorFactory;
|
||||||
private boolean usingCustomDrmSessionManagerProvider;
|
private boolean usingCustomDrmSessionManagerProvider;
|
||||||
private DrmSessionManagerProvider drmSessionManagerProvider;
|
private DrmSessionManagerProvider drmSessionManagerProvider;
|
||||||
private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
|
private LoadErrorHandlingPolicy loadErrorHandlingPolicy;
|
||||||
|
|
@ -72,15 +72,26 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
this(dataSourceFactory, new DefaultExtractorsFactory());
|
this(dataSourceFactory, new DefaultExtractorsFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Equivalent to {@link #Factory(DataSource.Factory, ProgressiveMediaExtractor.Factory) new
|
||||||
|
* Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}.
|
||||||
|
*/
|
||||||
|
public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) {
|
||||||
|
this(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new factory for {@link ProgressiveMediaSource}s.
|
* Creates a new factory for {@link ProgressiveMediaSource}s.
|
||||||
*
|
*
|
||||||
* @param dataSourceFactory A factory for {@link DataSource}s to read the media.
|
* @param dataSourceFactory A factory for {@link DataSource}s to read the media.
|
||||||
* @param extractorsFactory A factory for extractors used to extract media from its container.
|
* @param progressiveMediaExtractorFactory A factory for the {@link ProgressiveMediaExtractor}
|
||||||
|
* to extract media from its container.
|
||||||
*/
|
*/
|
||||||
public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) {
|
public Factory(
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
ProgressiveMediaExtractor.Factory progressiveMediaExtractorFactory) {
|
||||||
this.dataSourceFactory = dataSourceFactory;
|
this.dataSourceFactory = dataSourceFactory;
|
||||||
this.extractorsFactory = extractorsFactory;
|
this.progressiveMediaExtractorFactory = progressiveMediaExtractorFactory;
|
||||||
drmSessionManagerProvider = new DefaultDrmSessionManagerProvider();
|
drmSessionManagerProvider = new DefaultDrmSessionManagerProvider();
|
||||||
loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy();
|
loadErrorHandlingPolicy = new DefaultLoadErrorHandlingPolicy();
|
||||||
continueLoadingCheckIntervalBytes = DEFAULT_LOADING_CHECK_INTERVAL_BYTES;
|
continueLoadingCheckIntervalBytes = DEFAULT_LOADING_CHECK_INTERVAL_BYTES;
|
||||||
|
|
@ -93,8 +104,10 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Factory setExtractorsFactory(@Nullable ExtractorsFactory extractorsFactory) {
|
public Factory setExtractorsFactory(@Nullable ExtractorsFactory extractorsFactory) {
|
||||||
this.extractorsFactory =
|
this.progressiveMediaExtractorFactory =
|
||||||
extractorsFactory != null ? extractorsFactory : new DefaultExtractorsFactory();
|
() ->
|
||||||
|
new BundledExtractorsAdapter(
|
||||||
|
extractorsFactory != null ? extractorsFactory : new DefaultExtractorsFactory());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -220,7 +233,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
return new ProgressiveMediaSource(
|
return new ProgressiveMediaSource(
|
||||||
mediaItem,
|
mediaItem,
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
extractorsFactory,
|
progressiveMediaExtractorFactory,
|
||||||
drmSessionManagerProvider.get(mediaItem),
|
drmSessionManagerProvider.get(mediaItem),
|
||||||
loadErrorHandlingPolicy,
|
loadErrorHandlingPolicy,
|
||||||
continueLoadingCheckIntervalBytes);
|
continueLoadingCheckIntervalBytes);
|
||||||
|
|
@ -241,7 +254,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
private final MediaItem mediaItem;
|
private final MediaItem mediaItem;
|
||||||
private final MediaItem.PlaybackProperties playbackProperties;
|
private final MediaItem.PlaybackProperties playbackProperties;
|
||||||
private final DataSource.Factory dataSourceFactory;
|
private final DataSource.Factory dataSourceFactory;
|
||||||
private final ExtractorsFactory extractorsFactory;
|
private final ProgressiveMediaExtractor.Factory progressiveMediaExtractorFactory;
|
||||||
private final DrmSessionManager drmSessionManager;
|
private final DrmSessionManager drmSessionManager;
|
||||||
private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy;
|
private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy;
|
||||||
private final int continueLoadingCheckIntervalBytes;
|
private final int continueLoadingCheckIntervalBytes;
|
||||||
|
|
@ -256,14 +269,14 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
/* package */ ProgressiveMediaSource(
|
/* package */ ProgressiveMediaSource(
|
||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
DataSource.Factory dataSourceFactory,
|
DataSource.Factory dataSourceFactory,
|
||||||
ExtractorsFactory extractorsFactory,
|
ProgressiveMediaExtractor.Factory progressiveMediaExtractorFactory,
|
||||||
DrmSessionManager drmSessionManager,
|
DrmSessionManager drmSessionManager,
|
||||||
LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy,
|
LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy,
|
||||||
int continueLoadingCheckIntervalBytes) {
|
int continueLoadingCheckIntervalBytes) {
|
||||||
this.playbackProperties = checkNotNull(mediaItem.playbackProperties);
|
this.playbackProperties = checkNotNull(mediaItem.playbackProperties);
|
||||||
this.mediaItem = mediaItem;
|
this.mediaItem = mediaItem;
|
||||||
this.dataSourceFactory = dataSourceFactory;
|
this.dataSourceFactory = dataSourceFactory;
|
||||||
this.extractorsFactory = extractorsFactory;
|
this.progressiveMediaExtractorFactory = progressiveMediaExtractorFactory;
|
||||||
this.drmSessionManager = drmSessionManager;
|
this.drmSessionManager = drmSessionManager;
|
||||||
this.loadableLoadErrorHandlingPolicy = loadableLoadErrorHandlingPolicy;
|
this.loadableLoadErrorHandlingPolicy = loadableLoadErrorHandlingPolicy;
|
||||||
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes;
|
||||||
|
|
@ -308,7 +321,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
|
||||||
return new ProgressiveMediaPeriod(
|
return new ProgressiveMediaPeriod(
|
||||||
playbackProperties.uri,
|
playbackProperties.uri,
|
||||||
dataSource,
|
dataSource,
|
||||||
extractorsFactory,
|
progressiveMediaExtractorFactory.createProgressiveMediaExtractor(),
|
||||||
drmSessionManager,
|
drmSessionManager,
|
||||||
createDrmEventDispatcher(id),
|
createDrmEventDispatcher(id),
|
||||||
loadableLoadErrorHandlingPolicy,
|
loadableLoadErrorHandlingPolicy,
|
||||||
|
|
|
||||||
|
|
@ -24,22 +24,37 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
|
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||||
import com.google.android.exoplayer2.extractor.Extractor;
|
|
||||||
import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor;
|
import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor;
|
||||||
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
|
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
|
||||||
import com.google.android.exoplayer2.upstream.AssetDataSource;
|
import com.google.android.exoplayer2.upstream.AssetDataSource;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultAllocator;
|
import com.google.android.exoplayer2.upstream.DefaultAllocator;
|
||||||
import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy;
|
import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
/** Unit test for {@link ProgressiveMediaPeriod}. */
|
/** Unit test for {@link ProgressiveMediaPeriod}. */
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class ProgressiveMediaPeriodTest {
|
public final class ProgressiveMediaPeriodTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void prepare_updatesSourceInfoBeforeOnPreparedCallback() throws Exception {
|
public void prepareUsingBundledExtractors_updatesSourceInfoBeforeOnPreparedCallback()
|
||||||
|
throws TimeoutException {
|
||||||
|
testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(
|
||||||
|
new BundledExtractorsAdapter(Mp4Extractor.FACTORY));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(sdk = 30)
|
||||||
|
public void prepareUsingMediaParser_updatesSourceInfoBeforeOnPreparedCallback()
|
||||||
|
throws TimeoutException {
|
||||||
|
testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(new MediaParserExtractorAdapter());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(
|
||||||
|
ProgressiveMediaExtractor extractor) throws TimeoutException {
|
||||||
AtomicBoolean sourceInfoRefreshCalled = new AtomicBoolean(false);
|
AtomicBoolean sourceInfoRefreshCalled = new AtomicBoolean(false);
|
||||||
ProgressiveMediaPeriod.Listener sourceInfoRefreshListener =
|
ProgressiveMediaPeriod.Listener sourceInfoRefreshListener =
|
||||||
(durationUs, isSeekable, isLive) -> sourceInfoRefreshCalled.set(true);
|
(durationUs, isSeekable, isLive) -> sourceInfoRefreshCalled.set(true);
|
||||||
|
|
@ -48,7 +63,7 @@ public final class ProgressiveMediaPeriodTest {
|
||||||
new ProgressiveMediaPeriod(
|
new ProgressiveMediaPeriod(
|
||||||
Uri.parse("asset://android_asset/media/mp4/sample.mp4"),
|
Uri.parse("asset://android_asset/media/mp4/sample.mp4"),
|
||||||
new AssetDataSource(ApplicationProvider.getApplicationContext()),
|
new AssetDataSource(ApplicationProvider.getApplicationContext()),
|
||||||
() -> new Extractor[] {new Mp4Extractor()},
|
extractor,
|
||||||
DrmSessionManager.DRM_UNSUPPORTED,
|
DrmSessionManager.DRM_UNSUPPORTED,
|
||||||
new DrmSessionEventListener.EventDispatcher()
|
new DrmSessionEventListener.EventDispatcher()
|
||||||
.withParameters(/* windowIndex= */ 0, mediaPeriodId),
|
.withParameters(/* windowIndex= */ 0, mediaPeriodId),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue