From b041b72bae6c8051d7752ca43aacedd58bba2ac8 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 1 Apr 2016 06:53:13 -0700 Subject: [PATCH] Yet more simplifications. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=118775612 --- .../exoplayer/demo/player/DemoPlayer.java | 14 +- .../exoplayer/chunk/ChunkSampleSource.java | 140 ++++-------------- ...va => ChunkSampleSourceEventListener.java} | 97 +++++++++++- .../android/exoplayer/hls/HlsChunkSource.java | 6 - .../exoplayer/hls/HlsSampleSource.java | 112 +++----------- 5 files changed, 150 insertions(+), 219 deletions(-) rename library/src/main/java/com/google/android/exoplayer/chunk/{BaseChunkSampleSourceEventListener.java => ChunkSampleSourceEventListener.java} (60%) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java index 47b46413eb..e99e110e0f 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java @@ -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>, - DebugTextViewHelper.Provider { + ChunkSampleSourceEventListener, ExtractorSampleSource.EventListener, + SingleSampleSource.EventListener, DefaultBandwidthMeter.EventListener, + MediaCodecVideoTrackRenderer.EventListener, MediaCodecAudioTrackRenderer.EventListener, + StreamingDrmSessionManager.EventListener, DashChunkSource.EventListener, TextRenderer, + MetadataRenderer>, DebugTextViewHelper.Provider { /** * Builds a source to play. diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java index 184c8cab62..2b5183cfde 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java @@ -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 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)); - } - }); - } - } - } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/BaseChunkSampleSourceEventListener.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSourceEventListener.java similarity index 60% rename from library/src/main/java/com/google/android/exoplayer/chunk/BaseChunkSampleSourceEventListener.java rename to library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSourceEventListener.java index 8d6e5dd965..f961ce2f58 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/BaseChunkSampleSourceEventListener.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSourceEventListener.java @@ -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)); + } + }); + } + } + + } + } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java index 71e06d67c7..093c79f1aa 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java @@ -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; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java index fc91a8aa18..a484ec4f45 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java @@ -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 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;