From 7b3690a0a62793f75ade69c484bb2d975362026e Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 20 Jul 2016 04:28:30 +0100 Subject: [PATCH] Fix onLoad* event media times for multi-period case ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=137932100 --- .../AdaptiveMediaSourceEventListener.java | 41 +++++++++++++------ .../source/dash/DashMediaSource.java | 10 +++-- .../source/dash/manifest/Period.java | 6 +-- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java b/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java index 77b49f2be0..f97d4a1542 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java @@ -15,8 +15,6 @@ */ package com.google.android.exoplayer2.source; -import static com.google.android.exoplayer2.C.usToMs; - import android.os.Handler; import android.os.SystemClock; import com.google.android.exoplayer2.C; @@ -174,10 +172,21 @@ public interface AdaptiveMediaSourceEventListener { private final Handler handler; private final AdaptiveMediaSourceEventListener listener; + private final long mediaTimeOffsetMs; public EventDispatcher(Handler handler, AdaptiveMediaSourceEventListener listener) { + this(handler, listener, 0); + } + + public EventDispatcher(Handler handler, AdaptiveMediaSourceEventListener listener, + long mediaTimeOffsetMs) { this.handler = listener != null ? Assertions.checkNotNull(handler) : null; this.listener = listener; + this.mediaTimeOffsetMs = mediaTimeOffsetMs; + } + + public EventDispatcher copyWithMediaTimeOffsetMs(long mediaTimeOffsetMs) { + return new EventDispatcher(handler, listener, mediaTimeOffsetMs); } public void loadStarted(DataSpec dataSpec, int dataType, long elapsedRealtimeMs) { @@ -193,8 +202,8 @@ public interface AdaptiveMediaSourceEventListener { @Override public void run() { listener.onLoadStarted(dataSpec, dataType, trackType, trackFormat, trackSelectionReason, - trackSelectionData, usToMs(mediaStartTimeUs), usToMs(mediaEndTimeUs), - elapsedRealtimeMs); + trackSelectionData, adjustMediaTime(mediaStartTimeUs), + adjustMediaTime(mediaEndTimeUs), elapsedRealtimeMs); } }); } @@ -215,8 +224,8 @@ public interface AdaptiveMediaSourceEventListener { @Override public void run() { listener.onLoadCompleted(dataSpec, dataType, trackType, trackFormat, - trackSelectionReason, trackSelectionData, usToMs(mediaStartTimeUs), - usToMs(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs, bytesLoaded); + trackSelectionReason, trackSelectionData, adjustMediaTime(mediaStartTimeUs), + adjustMediaTime(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs, bytesLoaded); } }); } @@ -237,8 +246,8 @@ public interface AdaptiveMediaSourceEventListener { @Override public void run() { listener.onLoadCanceled(dataSpec, dataType, trackType, trackFormat, - trackSelectionReason, trackSelectionData, usToMs(mediaStartTimeUs), - usToMs(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs, bytesLoaded); + trackSelectionReason, trackSelectionData, adjustMediaTime(mediaStartTimeUs), + adjustMediaTime(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs, bytesLoaded); } }); } @@ -261,8 +270,9 @@ public interface AdaptiveMediaSourceEventListener { @Override public void run() { listener.onLoadError(dataSpec, dataType, trackType, trackFormat, trackSelectionReason, - trackSelectionData, usToMs(mediaStartTimeUs), usToMs(mediaEndTimeUs), - elapsedRealtimeMs, loadDurationMs, bytesLoaded, error, wasCanceled); + trackSelectionData, adjustMediaTime(mediaStartTimeUs), + adjustMediaTime(mediaEndTimeUs), elapsedRealtimeMs, loadDurationMs, bytesLoaded, + error, wasCanceled); } }); } @@ -274,8 +284,8 @@ public interface AdaptiveMediaSourceEventListener { handler.post(new Runnable() { @Override public void run() { - listener.onUpstreamDiscarded(trackType, usToMs(mediaStartTimeUs), - usToMs(mediaEndTimeUs)); + listener.onUpstreamDiscarded(trackType, adjustMediaTime(mediaStartTimeUs), + adjustMediaTime(mediaEndTimeUs)); } }); } @@ -289,12 +299,17 @@ public interface AdaptiveMediaSourceEventListener { @Override public void run() { listener.onDownstreamFormatChanged(trackType, trackFormat, trackSelectionReason, - trackSelectionData, usToMs(mediaTimeUs)); + trackSelectionData, adjustMediaTime(mediaTimeUs)); } }); } } + private long adjustMediaTime(long mediaTimeUs) { + long mediaTimeMs = C.usToMs(mediaTimeUs); + return mediaTimeMs == C.TIME_UNSET ? C.TIME_UNSET : mediaTimeOffsetMs + mediaTimeMs; + } + } } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index f22d1693a9..01341f2163 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -170,10 +170,12 @@ public final class DashMediaSource implements MediaSource { } @Override - public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { - DashMediaPeriod mediaPeriod = new DashMediaPeriod(firstPeriodId + index, manifest, index, - chunkSourceFactory, minLoadableRetryCount, eventDispatcher, elapsedRealtimeOffsetMs, loader, - allocator); + public MediaPeriod createPeriod(int periodIndex, Allocator allocator, long positionUs) { + EventDispatcher periodEventDispatcher = eventDispatcher.copyWithMediaTimeOffsetMs( + manifest.getPeriod(periodIndex).startMs); + DashMediaPeriod mediaPeriod = new DashMediaPeriod(firstPeriodId + periodIndex, manifest, + periodIndex, chunkSourceFactory, minLoadableRetryCount, periodEventDispatcher, + elapsedRealtimeOffsetMs, loader, allocator); periodsById.put(mediaPeriod.id, mediaPeriod); return mediaPeriod; } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/manifest/Period.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/manifest/Period.java index 1d8b4fb300..269a63b7a9 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/manifest/Period.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/manifest/Period.java @@ -41,12 +41,12 @@ public class Period { /** * @param id The period identifier. May be null. - * @param start The start time of the period in milliseconds. + * @param startMs The start time of the period in milliseconds. * @param adaptationSets The adaptation sets belonging to the period. */ - public Period(String id, long start, List adaptationSets) { + public Period(String id, long startMs, List adaptationSets) { this.id = id; - this.startMs = start; + this.startMs = startMs; this.adaptationSets = Collections.unmodifiableList(adaptationSets); }