mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Yet more simplifications.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=118775612
This commit is contained in:
parent
9c2a971109
commit
b041b72bae
@ -31,11 +31,10 @@ import com.google.android.exoplayer.TimeRange;
|
||||
import com.google.android.exoplayer.TrackRenderer;
|
||||
import com.google.android.exoplayer.audio.AudioCapabilities;
|
||||
import com.google.android.exoplayer.audio.AudioTrack;
|
||||
import com.google.android.exoplayer.chunk.ChunkSampleSource;
|
||||
import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener;
|
||||
import com.google.android.exoplayer.dash.DashChunkSource;
|
||||
import com.google.android.exoplayer.drm.StreamingDrmSessionManager;
|
||||
import com.google.android.exoplayer.extractor.ExtractorSampleSource;
|
||||
import com.google.android.exoplayer.hls.HlsSampleSource;
|
||||
import com.google.android.exoplayer.metadata.MetadataTrackRenderer;
|
||||
import com.google.android.exoplayer.metadata.MetadataTrackRenderer.MetadataRenderer;
|
||||
import com.google.android.exoplayer.metadata.id3.Id3Frame;
|
||||
@ -65,12 +64,11 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
* SmoothStreaming and so on).
|
||||
*/
|
||||
public class DemoPlayer implements ExoPlayer.Listener, DefaultTrackSelector.EventListener,
|
||||
ChunkSampleSource.EventListener, HlsSampleSource.EventListener,
|
||||
ExtractorSampleSource.EventListener, SingleSampleSource.EventListener,
|
||||
DefaultBandwidthMeter.EventListener, MediaCodecVideoTrackRenderer.EventListener,
|
||||
MediaCodecAudioTrackRenderer.EventListener, StreamingDrmSessionManager.EventListener,
|
||||
DashChunkSource.EventListener, TextRenderer, MetadataRenderer<List<Id3Frame>>,
|
||||
DebugTextViewHelper.Provider {
|
||||
ChunkSampleSourceEventListener, ExtractorSampleSource.EventListener,
|
||||
SingleSampleSource.EventListener, DefaultBandwidthMeter.EventListener,
|
||||
MediaCodecVideoTrackRenderer.EventListener, MediaCodecAudioTrackRenderer.EventListener,
|
||||
StreamingDrmSessionManager.EventListener, DashChunkSource.EventListener, TextRenderer,
|
||||
MetadataRenderer<List<Id3Frame>>, DebugTextViewHelper.Provider {
|
||||
|
||||
/**
|
||||
* Builds a source to play.
|
||||
|
@ -25,11 +25,11 @@ import com.google.android.exoplayer.TrackGroup;
|
||||
import com.google.android.exoplayer.TrackGroupArray;
|
||||
import com.google.android.exoplayer.TrackSelection;
|
||||
import com.google.android.exoplayer.TrackStream;
|
||||
import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener.EventDispatcher;
|
||||
import com.google.android.exoplayer.extractor.DefaultTrackOutput;
|
||||
import com.google.android.exoplayer.upstream.Loader;
|
||||
import com.google.android.exoplayer.upstream.Loader.Loadable;
|
||||
import com.google.android.exoplayer.util.Assertions;
|
||||
import com.google.android.exoplayer.util.Util;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
@ -45,11 +45,6 @@ import java.util.List;
|
||||
*/
|
||||
public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Callback {
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be notified of {@link ChunkSampleSource} events.
|
||||
*/
|
||||
public interface EventListener extends BaseChunkSampleSourceEventListener {}
|
||||
|
||||
/**
|
||||
* The default minimum number of times to retry loading data prior to failing.
|
||||
*/
|
||||
@ -58,7 +53,6 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
private static final long NO_RESET_PENDING = Long.MIN_VALUE;
|
||||
|
||||
private final Loader loader;
|
||||
private final int eventSourceId;
|
||||
private final LoadControl loadControl;
|
||||
private final ChunkSource chunkSource;
|
||||
private final ChunkOperationHolder currentLoadableHolder;
|
||||
@ -66,8 +60,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
private final List<BaseMediaChunk> readOnlyMediaChunks;
|
||||
private final DefaultTrackOutput sampleQueue;
|
||||
private final int bufferSizeContribution;
|
||||
private final Handler eventHandler;
|
||||
private final EventListener eventListener;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
|
||||
private boolean prepared;
|
||||
private long downstreamPositionUs;
|
||||
@ -106,8 +99,8 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
* @param eventSourceId An identifier that gets passed to {@code eventListener} methods.
|
||||
*/
|
||||
public ChunkSampleSource(ChunkSource chunkSource, LoadControl loadControl,
|
||||
int bufferSizeContribution, Handler eventHandler, EventListener eventListener,
|
||||
int eventSourceId) {
|
||||
int bufferSizeContribution, Handler eventHandler,
|
||||
ChunkSampleSourceEventListener eventListener, int eventSourceId) {
|
||||
this(chunkSource, loadControl, bufferSizeContribution, eventHandler, eventListener,
|
||||
eventSourceId, DEFAULT_MIN_LOADABLE_RETRY_COUNT);
|
||||
}
|
||||
@ -124,15 +117,13 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
* before propagating an error.
|
||||
*/
|
||||
public ChunkSampleSource(ChunkSource chunkSource, LoadControl loadControl,
|
||||
int bufferSizeContribution, Handler eventHandler, EventListener eventListener,
|
||||
int eventSourceId, int minLoadableRetryCount) {
|
||||
int bufferSizeContribution, Handler eventHandler,
|
||||
ChunkSampleSourceEventListener eventListener, int eventSourceId, int minLoadableRetryCount) {
|
||||
this.chunkSource = chunkSource;
|
||||
this.loadControl = loadControl;
|
||||
this.bufferSizeContribution = bufferSizeContribution;
|
||||
this.eventHandler = eventHandler;
|
||||
this.eventListener = eventListener;
|
||||
this.eventSourceId = eventSourceId;
|
||||
loader = new Loader("Loader:ChunkSampleSource", minLoadableRetryCount);
|
||||
eventDispatcher = new EventDispatcher(eventHandler, eventListener, eventSourceId);
|
||||
currentLoadableHolder = new ChunkOperationHolder();
|
||||
mediaChunks = new LinkedList<>();
|
||||
readOnlyMediaChunks = Collections.unmodifiableList(mediaChunks);
|
||||
@ -200,9 +191,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
if (loader.isLoading()) {
|
||||
loader.cancelLoading();
|
||||
} else {
|
||||
sampleQueue.clear();
|
||||
mediaChunks.clear();
|
||||
clearCurrentLoadable();
|
||||
clearState();
|
||||
loadControl.trimAllocator();
|
||||
}
|
||||
} else if (trackEnabled) {
|
||||
@ -307,7 +296,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
}
|
||||
|
||||
if (downstreamFormat == null || !downstreamFormat.equals(currentChunk.format)) {
|
||||
notifyDownstreamFormatChanged(currentChunk.format, currentChunk.trigger,
|
||||
eventDispatcher.downstreamFormatChanged(currentChunk.format, currentChunk.trigger,
|
||||
currentChunk.startTimeUs);
|
||||
downstreamFormat = currentChunk.format;
|
||||
}
|
||||
@ -351,10 +340,11 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
chunkSource.onChunkLoadCompleted(currentLoadable);
|
||||
if (isMediaChunk(currentLoadable)) {
|
||||
BaseMediaChunk mediaChunk = (BaseMediaChunk) currentLoadable;
|
||||
notifyLoadCompleted(currentLoadable.bytesLoaded(), mediaChunk.type, mediaChunk.trigger,
|
||||
mediaChunk.format, mediaChunk.startTimeUs, mediaChunk.endTimeUs, now, loadDurationMs);
|
||||
eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), mediaChunk.type,
|
||||
mediaChunk.trigger, mediaChunk.format, mediaChunk.startTimeUs, mediaChunk.endTimeUs, now,
|
||||
loadDurationMs);
|
||||
} else {
|
||||
notifyLoadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
|
||||
eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
|
||||
currentLoadable.trigger, currentLoadable.format, -1, -1, now, loadDurationMs);
|
||||
}
|
||||
clearCurrentLoadable();
|
||||
@ -364,13 +354,11 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
@Override
|
||||
public void onLoadCanceled(Loadable loadable) {
|
||||
Chunk currentLoadable = currentLoadableHolder.chunk;
|
||||
notifyLoadCanceled(currentLoadable.bytesLoaded());
|
||||
clearCurrentLoadable();
|
||||
eventDispatcher.loadCanceled(currentLoadable.bytesLoaded());
|
||||
if (trackEnabled) {
|
||||
restartFrom(pendingResetPositionUs);
|
||||
} else {
|
||||
sampleQueue.clear();
|
||||
mediaChunks.clear();
|
||||
clearState();
|
||||
loadControl.trimAllocator();
|
||||
}
|
||||
}
|
||||
@ -391,12 +379,12 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
}
|
||||
}
|
||||
clearCurrentLoadable();
|
||||
notifyLoadError(e);
|
||||
notifyLoadCanceled(bytesLoaded);
|
||||
eventDispatcher.loadError(e);
|
||||
eventDispatcher.loadCanceled(bytesLoaded);
|
||||
maybeStartLoading();
|
||||
return Loader.DONT_RETRY;
|
||||
} else {
|
||||
notifyLoadError(e);
|
||||
eventDispatcher.loadError(e);
|
||||
return Loader.RETRY;
|
||||
}
|
||||
}
|
||||
@ -420,13 +408,17 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
if (loader.isLoading()) {
|
||||
loader.cancelLoading();
|
||||
} else {
|
||||
sampleQueue.clear();
|
||||
mediaChunks.clear();
|
||||
clearCurrentLoadable();
|
||||
clearState();
|
||||
maybeStartLoading();
|
||||
}
|
||||
}
|
||||
|
||||
private void clearState() {
|
||||
sampleQueue.clear();
|
||||
mediaChunks.clear();
|
||||
clearCurrentLoadable();
|
||||
}
|
||||
|
||||
private void clearCurrentLoadable() {
|
||||
currentLoadableHolder.chunk = null;
|
||||
}
|
||||
@ -482,10 +474,10 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
if (isPendingReset()) {
|
||||
pendingResetPositionUs = NO_RESET_PENDING;
|
||||
}
|
||||
notifyLoadStarted(mediaChunk.dataSpec.length, mediaChunk.type, mediaChunk.trigger,
|
||||
eventDispatcher.loadStarted(mediaChunk.dataSpec.length, mediaChunk.type, mediaChunk.trigger,
|
||||
mediaChunk.format, mediaChunk.startTimeUs, mediaChunk.endTimeUs);
|
||||
} else {
|
||||
notifyLoadStarted(currentLoadable.dataSpec.length, currentLoadable.type,
|
||||
eventDispatcher.loadStarted(currentLoadable.dataSpec.length, currentLoadable.type,
|
||||
currentLoadable.trigger, currentLoadable.format, -1, -1);
|
||||
}
|
||||
loader.startLoading(currentLoadable, this);
|
||||
@ -524,8 +516,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
startTimeUs = removed.startTimeUs;
|
||||
}
|
||||
sampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex());
|
||||
|
||||
notifyUpstreamDiscarded(startTimeUs, endTimeUs);
|
||||
eventDispatcher.upstreamDiscarded(startTimeUs, endTimeUs);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -537,79 +528,4 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call
|
||||
return pendingResetPositionUs != NO_RESET_PENDING;
|
||||
}
|
||||
|
||||
private void notifyLoadStarted(final long length, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadStarted(eventSourceId, length, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadCompleted(final long bytesLoaded, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs,
|
||||
final long elapsedRealtimeMs, final long loadDurationMs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadCompleted(eventSourceId, bytesLoaded, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs), elapsedRealtimeMs,
|
||||
loadDurationMs);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadCanceled(final long bytesLoaded) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadCanceled(eventSourceId, bytesLoaded);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadError(final IOException e) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadError(eventSourceId, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyUpstreamDiscarded(final long mediaStartTimeUs, final long mediaEndTimeUs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onUpstreamDiscarded(eventSourceId, Util.usToMs(mediaStartTimeUs),
|
||||
Util.usToMs(mediaEndTimeUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyDownstreamFormatChanged(final Format format, final int trigger,
|
||||
final long positionUs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onDownstreamFormatChanged(eventSourceId, format, trigger,
|
||||
Util.usToMs(positionUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,13 +19,16 @@ import com.google.android.exoplayer.C;
|
||||
import com.google.android.exoplayer.Format;
|
||||
import com.google.android.exoplayer.SampleSource;
|
||||
import com.google.android.exoplayer.TrackStream;
|
||||
import com.google.android.exoplayer.util.Util;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Interface for callbacks to be notified of chunk based {@link SampleSource} events.
|
||||
*/
|
||||
public interface BaseChunkSampleSourceEventListener {
|
||||
public interface ChunkSampleSourceEventListener {
|
||||
|
||||
/**
|
||||
* Invoked when an upstream load is started.
|
||||
@ -102,4 +105,96 @@ public interface BaseChunkSampleSourceEventListener {
|
||||
*/
|
||||
void onDownstreamFormatChanged(int sourceId, Format format, int trigger, long mediaTimeMs);
|
||||
|
||||
/**
|
||||
* Dispatches events to a {@link ChunkSampleSourceEventListener}.
|
||||
*/
|
||||
final class EventDispatcher {
|
||||
|
||||
private final Handler handler;
|
||||
private final ChunkSampleSourceEventListener listener;
|
||||
private final int sourceId;
|
||||
|
||||
public EventDispatcher(Handler handler, ChunkSampleSourceEventListener listener, int sourceId) {
|
||||
this.handler = listener != null ? handler : null;
|
||||
this.listener = listener;
|
||||
this.sourceId = sourceId;
|
||||
}
|
||||
|
||||
public void loadStarted(final long length, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onLoadStarted(sourceId, length, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void loadCompleted(final long bytesLoaded, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs,
|
||||
final long elapsedRealtimeMs, final long loadDurationMs) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onLoadCompleted(sourceId, bytesLoaded, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs), elapsedRealtimeMs,
|
||||
loadDurationMs);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void loadCanceled(final long bytesLoaded) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onLoadCanceled(sourceId, bytesLoaded);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void loadError(final IOException e) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onLoadError(sourceId, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void upstreamDiscarded(final long mediaStartTimeUs, final long mediaEndTimeUs) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onUpstreamDiscarded(sourceId, Util.usToMs(mediaStartTimeUs),
|
||||
Util.usToMs(mediaEndTimeUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void downstreamFormatChanged(final Format format, final int trigger,
|
||||
final long positionUs) {
|
||||
if (listener != null) {
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
listener.onDownstreamFormatChanged(sourceId, format, trigger,
|
||||
Util.usToMs(positionUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer.hls;
|
||||
import com.google.android.exoplayer.BehindLiveWindowException;
|
||||
import com.google.android.exoplayer.C;
|
||||
import com.google.android.exoplayer.Format;
|
||||
import com.google.android.exoplayer.chunk.BaseChunkSampleSourceEventListener;
|
||||
import com.google.android.exoplayer.chunk.Chunk;
|
||||
import com.google.android.exoplayer.chunk.ChunkOperationHolder;
|
||||
import com.google.android.exoplayer.chunk.DataChunk;
|
||||
@ -57,11 +56,6 @@ import java.util.Locale;
|
||||
*/
|
||||
public class HlsChunkSource {
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be notified of {@link HlsChunkSource} events.
|
||||
*/
|
||||
public interface EventListener extends BaseChunkSampleSourceEventListener {}
|
||||
|
||||
public static final int TYPE_DEFAULT = 0;
|
||||
public static final int TYPE_AUDIO = 1;
|
||||
public static final int TYPE_SUBTITLE = 2;
|
||||
|
@ -25,14 +25,14 @@ import com.google.android.exoplayer.TrackGroup;
|
||||
import com.google.android.exoplayer.TrackGroupArray;
|
||||
import com.google.android.exoplayer.TrackSelection;
|
||||
import com.google.android.exoplayer.TrackStream;
|
||||
import com.google.android.exoplayer.chunk.BaseChunkSampleSourceEventListener;
|
||||
import com.google.android.exoplayer.chunk.Chunk;
|
||||
import com.google.android.exoplayer.chunk.ChunkOperationHolder;
|
||||
import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener;
|
||||
import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener.EventDispatcher;
|
||||
import com.google.android.exoplayer.upstream.Loader;
|
||||
import com.google.android.exoplayer.upstream.Loader.Loadable;
|
||||
import com.google.android.exoplayer.util.Assertions;
|
||||
import com.google.android.exoplayer.util.MimeTypes;
|
||||
import com.google.android.exoplayer.util.Util;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
@ -47,11 +47,6 @@ import java.util.List;
|
||||
*/
|
||||
public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be notified of {@link HlsSampleSource} events.
|
||||
*/
|
||||
public interface EventListener extends BaseChunkSampleSourceEventListener {}
|
||||
|
||||
/**
|
||||
* The default minimum number of times to retry loading data prior to failing.
|
||||
*/
|
||||
@ -69,11 +64,8 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
private final LinkedList<HlsExtractorWrapper> extractors;
|
||||
private final int bufferSizeContribution;
|
||||
private final ChunkOperationHolder chunkOperationHolder;
|
||||
|
||||
private final int eventSourceId;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final LoadControl loadControl;
|
||||
private final Handler eventHandler;
|
||||
private final EventListener eventListener;
|
||||
|
||||
private boolean prepared;
|
||||
private boolean seenFirstTrackSelection;
|
||||
@ -108,23 +100,21 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
}
|
||||
|
||||
public HlsSampleSource(HlsChunkSource chunkSource, LoadControl loadControl,
|
||||
int bufferSizeContribution, Handler eventHandler, EventListener eventListener,
|
||||
int eventSourceId) {
|
||||
int bufferSizeContribution, Handler eventHandler,
|
||||
ChunkSampleSourceEventListener eventListener, int eventSourceId) {
|
||||
this(chunkSource, loadControl, bufferSizeContribution, eventHandler, eventListener,
|
||||
eventSourceId, DEFAULT_MIN_LOADABLE_RETRY_COUNT);
|
||||
}
|
||||
|
||||
public HlsSampleSource(HlsChunkSource chunkSource, LoadControl loadControl,
|
||||
int bufferSizeContribution, Handler eventHandler, EventListener eventListener,
|
||||
int eventSourceId, int minLoadableRetryCount) {
|
||||
int bufferSizeContribution, Handler eventHandler,
|
||||
ChunkSampleSourceEventListener eventListener, int eventSourceId, int minLoadableRetryCount) {
|
||||
this.chunkSource = chunkSource;
|
||||
this.loadControl = loadControl;
|
||||
this.bufferSizeContribution = bufferSizeContribution;
|
||||
this.eventHandler = eventHandler;
|
||||
this.eventListener = eventListener;
|
||||
this.eventSourceId = eventSourceId;
|
||||
this.pendingResetPositionUs = NO_RESET_PENDING;
|
||||
loader = new Loader("Loader:HLS", minLoadableRetryCount);
|
||||
eventDispatcher = new EventDispatcher(eventHandler, eventListener, eventSourceId);
|
||||
extractors = new LinkedList<>();
|
||||
chunkOperationHolder = new ChunkOperationHolder();
|
||||
}
|
||||
@ -336,7 +326,8 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
|
||||
if (downstreamFormat == null || !downstreamFormat.equals(extractor.format)) {
|
||||
// Notify a change in the downstream format.
|
||||
notifyDownstreamFormatChanged(extractor.format, extractor.trigger, extractor.startTimeUs);
|
||||
eventDispatcher.downstreamFormatChanged(extractor.format, extractor.trigger,
|
||||
extractor.startTimeUs);
|
||||
downstreamFormat = extractor.format;
|
||||
}
|
||||
|
||||
@ -389,11 +380,11 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
if (isTsChunk(currentLoadable)) {
|
||||
Assertions.checkState(currentLoadable == currentTsLoadable);
|
||||
previousTsLoadable = currentTsLoadable;
|
||||
notifyLoadCompleted(currentLoadable.bytesLoaded(), currentTsLoadable.type,
|
||||
eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentTsLoadable.type,
|
||||
currentTsLoadable.trigger, currentTsLoadable.format, currentTsLoadable.startTimeUs,
|
||||
currentTsLoadable.endTimeUs, now, loadDurationMs);
|
||||
} else {
|
||||
notifyLoadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
|
||||
eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type,
|
||||
currentLoadable.trigger, currentLoadable.format, -1, -1, now, loadDurationMs);
|
||||
}
|
||||
clearCurrentLoadable();
|
||||
@ -402,7 +393,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
|
||||
@Override
|
||||
public void onLoadCanceled(Loadable loadable) {
|
||||
notifyLoadCanceled(currentLoadable.bytesLoaded());
|
||||
eventDispatcher.loadCanceled(currentLoadable.bytesLoaded());
|
||||
if (enabledTrackCount > 0) {
|
||||
restartFrom(pendingResetPositionUs);
|
||||
} else {
|
||||
@ -416,16 +407,16 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
long bytesLoaded = currentLoadable.bytesLoaded();
|
||||
boolean cancelable = !isTsChunk(currentLoadable) || bytesLoaded == 0;
|
||||
if (chunkSource.onChunkLoadError(currentLoadable, cancelable, e)) {
|
||||
eventDispatcher.loadError(e);
|
||||
eventDispatcher.loadCanceled(bytesLoaded);
|
||||
clearCurrentLoadable();
|
||||
if (previousTsLoadable == null && !isPendingReset()) {
|
||||
pendingResetPositionUs = lastSeekPositionUs;
|
||||
}
|
||||
clearCurrentLoadable();
|
||||
notifyLoadError(e);
|
||||
notifyLoadCanceled(bytesLoaded);
|
||||
maybeStartLoading();
|
||||
return Loader.DONT_RETRY;
|
||||
} else {
|
||||
notifyLoadError(e);
|
||||
eventDispatcher.loadError(e);
|
||||
return Loader.RETRY;
|
||||
}
|
||||
}
|
||||
@ -679,11 +670,11 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
extractorWrapper.init(loadControl.getAllocator());
|
||||
extractors.addLast(extractorWrapper);
|
||||
}
|
||||
notifyLoadStarted(tsChunk.dataSpec.length, tsChunk.type, tsChunk.trigger, tsChunk.format,
|
||||
tsChunk.startTimeUs, tsChunk.endTimeUs);
|
||||
eventDispatcher.loadStarted(tsChunk.dataSpec.length, tsChunk.type, tsChunk.trigger,
|
||||
tsChunk.format, tsChunk.startTimeUs, tsChunk.endTimeUs);
|
||||
currentTsLoadable = tsChunk;
|
||||
} else {
|
||||
notifyLoadStarted(currentLoadable.dataSpec.length, currentLoadable.type,
|
||||
eventDispatcher.loadStarted(currentLoadable.dataSpec.length, currentLoadable.type,
|
||||
currentLoadable.trigger, currentLoadable.format, -1, -1);
|
||||
}
|
||||
loader.startLoading(currentLoadable, this);
|
||||
@ -712,69 +703,6 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback {
|
||||
return pendingResetPositionUs != NO_RESET_PENDING;
|
||||
}
|
||||
|
||||
private void notifyLoadStarted(final long length, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadStarted(eventSourceId, length, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadCompleted(final long bytesLoaded, final int type, final int trigger,
|
||||
final Format format, final long mediaStartTimeUs, final long mediaEndTimeUs,
|
||||
final long elapsedRealtimeMs, final long loadDurationMs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadCompleted(eventSourceId, bytesLoaded, type, trigger, format,
|
||||
Util.usToMs(mediaStartTimeUs), Util.usToMs(mediaEndTimeUs), elapsedRealtimeMs,
|
||||
loadDurationMs);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadCanceled(final long bytesLoaded) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadCanceled(eventSourceId, bytesLoaded);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLoadError(final IOException e) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onLoadError(eventSourceId, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyDownstreamFormatChanged(final Format format, final int trigger,
|
||||
final long positionUs) {
|
||||
if (eventHandler != null && eventListener != null) {
|
||||
eventHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventListener.onDownstreamFormatChanged(eventSourceId, format, trigger,
|
||||
Util.usToMs(positionUs));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private final class TrackStreamImpl implements TrackStream {
|
||||
|
||||
private final int group;
|
||||
|
Loading…
x
Reference in New Issue
Block a user