Pass player and isTopLevelSource to MediaSource.prepareSource.

These additions are useful for sources that need to track the playback position
and control playback.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140828310
This commit is contained in:
andrewlewis 2016-12-02 01:56:10 -08:00 committed by Oliver Woodman
parent 0a52e823de
commit 45bc4a0374
14 changed files with 37 additions and 42 deletions

View File

@ -208,7 +208,7 @@ public final class ExoPlayerTest extends TestCase {
} }
@Override @Override
public void prepareSource(Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
assertFalse(preparedSource); assertFalse(preparedSource);
preparedSource = true; preparedSource = true;
listener.onSourceInfoRefreshed(timeline, manifest); listener.onSourceInfoRefreshed(timeline, manifest);

View File

@ -95,7 +95,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
}; };
playbackInfo = new ExoPlayerImplInternal.PlaybackInfo(0, 0); playbackInfo = new ExoPlayerImplInternal.PlaybackInfo(0, 0);
internalPlayer = new ExoPlayerImplInternal(renderers, trackSelector, loadControl, playWhenReady, internalPlayer = new ExoPlayerImplInternal(renderers, trackSelector, loadControl, playWhenReady,
eventHandler, playbackInfo); eventHandler, playbackInfo, this);
} }
@Override @Override

View File

@ -145,6 +145,7 @@ import java.io.IOException;
private final Handler handler; private final Handler handler;
private final HandlerThread internalPlaybackThread; private final HandlerThread internalPlaybackThread;
private final Handler eventHandler; private final Handler eventHandler;
private final ExoPlayer player;
private final Timeline.Window window; private final Timeline.Window window;
private final Timeline.Period period; private final Timeline.Period period;
@ -174,7 +175,7 @@ import java.io.IOException;
public ExoPlayerImplInternal(Renderer[] renderers, TrackSelector trackSelector, public ExoPlayerImplInternal(Renderer[] renderers, TrackSelector trackSelector,
LoadControl loadControl, boolean playWhenReady, Handler eventHandler, LoadControl loadControl, boolean playWhenReady, Handler eventHandler,
PlaybackInfo playbackInfo) { PlaybackInfo playbackInfo, ExoPlayer player) {
this.renderers = renderers; this.renderers = renderers;
this.trackSelector = trackSelector; this.trackSelector = trackSelector;
this.loadControl = loadControl; this.loadControl = loadControl;
@ -182,6 +183,7 @@ import java.io.IOException;
this.eventHandler = eventHandler; this.eventHandler = eventHandler;
this.state = ExoPlayer.STATE_IDLE; this.state = ExoPlayer.STATE_IDLE;
this.playbackInfo = playbackInfo; this.playbackInfo = playbackInfo;
this.player = player;
rendererCapabilities = new RendererCapabilities[renderers.length]; rendererCapabilities = new RendererCapabilities[renderers.length];
for (int i = 0; i < renderers.length; i++) { for (int i = 0; i < renderers.length; i++) {
@ -382,7 +384,7 @@ import java.io.IOException;
playbackInfo = new PlaybackInfo(0, C.TIME_UNSET); playbackInfo = new PlaybackInfo(0, C.TIME_UNSET);
} }
this.mediaSource = mediaSource; this.mediaSource = mediaSource;
mediaSource.prepareSource(this); mediaSource.prepareSource(player, true, this);
setState(ExoPlayer.STATE_BUFFERING); setState(ExoPlayer.STATE_BUFFERING);
handler.sendEmptyMessage(MSG_DO_SOME_WORK); handler.sendEmptyMessage(MSG_DO_SOME_WORK);
} }

View File

@ -26,7 +26,6 @@ import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
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.ExtractorsFactory;
import com.google.android.exoplayer2.extractor.MpegAudioHeader;
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.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput;
@ -85,7 +84,6 @@ public final class MatroskaExtractor implements Extractor {
private static final String CODEC_ID_VORBIS = "A_VORBIS"; private static final String CODEC_ID_VORBIS = "A_VORBIS";
private static final String CODEC_ID_OPUS = "A_OPUS"; private static final String CODEC_ID_OPUS = "A_OPUS";
private static final String CODEC_ID_AAC = "A_AAC"; private static final String CODEC_ID_AAC = "A_AAC";
private static final String CODEC_ID_MP2 = "A_MPEG/L2";
private static final String CODEC_ID_MP3 = "A_MPEG/L3"; private static final String CODEC_ID_MP3 = "A_MPEG/L3";
private static final String CODEC_ID_AC3 = "A_AC3"; private static final String CODEC_ID_AC3 = "A_AC3";
private static final String CODEC_ID_E_AC3 = "A_EAC3"; private static final String CODEC_ID_E_AC3 = "A_EAC3";
@ -102,6 +100,7 @@ public final class MatroskaExtractor implements Extractor {
private static final int VORBIS_MAX_INPUT_SIZE = 8192; private static final int VORBIS_MAX_INPUT_SIZE = 8192;
private static final int OPUS_MAX_INPUT_SIZE = 5760; private static final int OPUS_MAX_INPUT_SIZE = 5760;
private static final int MP3_MAX_INPUT_SIZE = 4096;
private static final int ENCRYPTION_IV_SIZE = 8; private static final int ENCRYPTION_IV_SIZE = 8;
private static final int TRACK_TYPE_AUDIO = 2; private static final int TRACK_TYPE_AUDIO = 2;
@ -1219,7 +1218,6 @@ public final class MatroskaExtractor implements Extractor {
|| CODEC_ID_OPUS.equals(codecId) || CODEC_ID_OPUS.equals(codecId)
|| CODEC_ID_VORBIS.equals(codecId) || CODEC_ID_VORBIS.equals(codecId)
|| CODEC_ID_AAC.equals(codecId) || CODEC_ID_AAC.equals(codecId)
|| CODEC_ID_MP2.equals(codecId)
|| CODEC_ID_MP3.equals(codecId) || CODEC_ID_MP3.equals(codecId)
|| CODEC_ID_AC3.equals(codecId) || CODEC_ID_AC3.equals(codecId)
|| CODEC_ID_E_AC3.equals(codecId) || CODEC_ID_E_AC3.equals(codecId)
@ -1405,13 +1403,9 @@ public final class MatroskaExtractor implements Extractor {
mimeType = MimeTypes.AUDIO_AAC; mimeType = MimeTypes.AUDIO_AAC;
initializationData = Collections.singletonList(codecPrivate); initializationData = Collections.singletonList(codecPrivate);
break; break;
case CODEC_ID_MP2:
mimeType = MimeTypes.AUDIO_MPEG_L2;
maxInputSize = MpegAudioHeader.MAX_FRAME_SIZE_BYTES;
break;
case CODEC_ID_MP3: case CODEC_ID_MP3:
mimeType = MimeTypes.AUDIO_MPEG; mimeType = MimeTypes.AUDIO_MPEG;
maxInputSize = MpegAudioHeader.MAX_FRAME_SIZE_BYTES; maxInputSize = MP3_MAX_INPUT_SIZE;
break; break;
case CODEC_ID_AC3: case CODEC_ID_AC3:
mimeType = MimeTypes.AUDIO_AC3; mimeType = MimeTypes.AUDIO_AC3;

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source;
import android.util.Pair; import android.util.Pair;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
@ -53,12 +54,12 @@ public final class ConcatenatingMediaSource implements MediaSource {
} }
@Override @Override
public void prepareSource(Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
this.listener = listener; this.listener = listener;
for (int i = 0; i < mediaSources.length; i++) { for (int i = 0; i < mediaSources.length; i++) {
if (!duplicateFlags[i]) { if (!duplicateFlags[i]) {
final int index = i; final int index = i;
mediaSources[i].prepareSource(new Listener() { mediaSources[i].prepareSource(player, false, new Listener() {
@Override @Override
public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { public void onSourceInfoRefreshed(Timeline timeline, Object manifest) {
handleSourceInfoRefreshed(index, timeline, manifest); handleSourceInfoRefreshed(index, timeline, manifest);

View File

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
@ -135,7 +136,7 @@ public final class ExtractorMediaSource implements MediaSource, MediaSource.List
} }
@Override @Override
public void prepareSource(MediaSource.Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
sourceListener = listener; sourceListener = listener;
timeline = new SinglePeriodTimeline(C.TIME_UNSET, false); timeline = new SinglePeriodTimeline(C.TIME_UNSET, false);
listener.onSourceInfoRefreshed(timeline, null); listener.onSourceInfoRefreshed(timeline, null);

View File

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
@ -59,8 +60,8 @@ public final class LoopingMediaSource implements MediaSource {
} }
@Override @Override
public void prepareSource(final Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) {
childSource.prepareSource(new Listener() { childSource.prepareSource(player, false, new Listener() {
@Override @Override
public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { public void onSourceInfoRefreshed(Timeline timeline, Object manifest) {
childPeriodCount = timeline.getPeriodCount(); childPeriodCount = timeline.getPeriodCount();

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import java.io.IOException; import java.io.IOException;
@ -42,9 +43,14 @@ public interface MediaSource {
/** /**
* Starts preparation of the source. * Starts preparation of the source.
* *
* @param player The player for which this source is being prepared.
* @param isTopLevelSource Whether this source has been passed directly to
* {@link ExoPlayer#prepare(MediaSource)} or
* {@link ExoPlayer#prepare(MediaSource, boolean, boolean)}. If {@code false}, this source is
* being prepared by another source (e.g. {@link ConcatenatingMediaSource}) for composition.
* @param listener The listener for source events. * @param listener The listener for source events.
*/ */
void prepareSource(Listener listener); void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener);
/** /**
* Throws any pending error encountered while loading or refreshing source information. * Throws any pending error encountered while loading or refreshing source information.

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import java.io.IOException; import java.io.IOException;
@ -92,11 +93,11 @@ public final class MergingMediaSource implements MediaSource {
} }
@Override @Override
public void prepareSource(final Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) {
this.listener = listener; this.listener = listener;
for (int i = 0; i < mediaSources.length; i++) { for (int i = 0; i < mediaSources.length; i++) {
final int sourceIndex = i; final int sourceIndex = i;
mediaSources[sourceIndex].prepareSource(new Listener() { mediaSources[sourceIndex].prepareSource(player, false, new Listener() {
@Override @Override
public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { public void onSourceInfoRefreshed(Timeline timeline, Object manifest) {
handleSourceInfoRefreshed(sourceIndex, timeline, manifest); handleSourceInfoRefreshed(sourceIndex, timeline, manifest);

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
@ -84,7 +85,7 @@ public final class SingleSampleMediaSource implements MediaSource {
// MediaSource implementation. // MediaSource implementation.
@Override @Override
public void prepareSource(MediaSource.Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
listener.onSourceInfoRefreshed(timeline, null); listener.onSourceInfoRefreshed(timeline, null);
} }

View File

@ -21,6 +21,7 @@ import android.os.SystemClock;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
@ -94,7 +95,7 @@ public final class DashMediaSource implements MediaSource {
private final Runnable refreshManifestRunnable; private final Runnable refreshManifestRunnable;
private final Runnable simulateManifestRefreshRunnable; private final Runnable simulateManifestRefreshRunnable;
private MediaSource.Listener sourceListener; private Listener sourceListener;
private DataSource dataSource; private DataSource dataSource;
private Loader loader; private Loader loader;
private LoaderErrorThrower loaderErrorThrower; private LoaderErrorThrower loaderErrorThrower;
@ -258,7 +259,7 @@ public final class DashMediaSource implements MediaSource {
// MediaSource implementation. // MediaSource implementation.
@Override @Override
public void prepareSource(MediaSource.Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
sourceListener = listener; sourceListener = listener;
if (sideloadedManifest) { if (sideloadedManifest) {
loaderErrorThrower = new LoaderErrorThrower.Dummy(); loaderErrorThrower = new LoaderErrorThrower.Dummy();

View File

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source.hls;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
@ -48,7 +49,7 @@ public final class HlsMediaSource implements MediaSource,
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private HlsPlaylistTracker playlistTracker; private HlsPlaylistTracker playlistTracker;
private MediaSource.Listener sourceListener; private Listener sourceListener;
public HlsMediaSource(Uri manifestUri, DataSource.Factory dataSourceFactory, Handler eventHandler, public HlsMediaSource(Uri manifestUri, DataSource.Factory dataSourceFactory, Handler eventHandler,
AdaptiveMediaSourceEventListener eventListener) { AdaptiveMediaSourceEventListener eventListener) {
@ -66,7 +67,7 @@ public final class HlsMediaSource implements MediaSource,
} }
@Override @Override
public void prepareSource(MediaSource.Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(playlistTracker == null); Assertions.checkState(playlistTracker == null);
playlistTracker = new HlsPlaylistTracker(manifestUri, dataSourceFactory, eventDispatcher, playlistTracker = new HlsPlaylistTracker(manifestUri, dataSourceFactory, eventDispatcher,
minLoadableRetryCount, this); minLoadableRetryCount, this);

View File

@ -19,6 +19,7 @@ import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener;
@ -73,7 +74,7 @@ public final class SsMediaSource implements MediaSource,
private final SsManifestParser manifestParser; private final SsManifestParser manifestParser;
private final ArrayList<SsMediaPeriod> mediaPeriods; private final ArrayList<SsMediaPeriod> mediaPeriods;
private MediaSource.Listener sourceListener; private Listener sourceListener;
private DataSource manifestDataSource; private DataSource manifestDataSource;
private Loader manifestLoader; private Loader manifestLoader;
private LoaderErrorThrower manifestLoaderErrorThrower; private LoaderErrorThrower manifestLoaderErrorThrower;
@ -199,7 +200,7 @@ public final class SsMediaSource implements MediaSource,
// MediaSource implementation. // MediaSource implementation.
@Override @Override
public void prepareSource(MediaSource.Listener listener) { public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
sourceListener = listener; sourceListener = listener;
if (manifest != null) { if (manifest != null) {
manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy(); manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy();

View File

@ -472,16 +472,6 @@ public final class SimpleExoPlayerView extends FrameLayout {
return overlayFrameLayout; return overlayFrameLayout;
} }
/**
* Gets the {@link SubtitleView}.
*
* @return The {@link SubtitleView}, or {@code null} if the layout has been customized and the
* subtitle view is not present.
*/
public SubtitleView getSubtitleView() {
return subtitleView;
}
@Override @Override
public boolean onTouchEvent(MotionEvent ev) { public boolean onTouchEvent(MotionEvent ev) {
if (!useController || player == null || ev.getActionMasked() != MotionEvent.ACTION_DOWN) { if (!useController || player == null || ev.getActionMasked() != MotionEvent.ACTION_DOWN) {
@ -504,11 +494,6 @@ public final class SimpleExoPlayerView extends FrameLayout {
return true; return true;
} }
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return useController ? controller.dispatchKeyEvent(event) : super.dispatchKeyEvent(event);
}
private void maybeShowController(boolean isForced) { private void maybeShowController(boolean isForced) {
if (!useController || player == null) { if (!useController || player == null) {
return; return;