Fix onLoad* event media times for multi-period case

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137932100
This commit is contained in:
olly 2016-07-20 04:28:30 +01:00 committed by Oliver Woodman
parent 488c2d8270
commit 7b3690a0a6
3 changed files with 37 additions and 20 deletions

View file

@ -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;
}
}
}

View file

@ -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;
}

View file

@ -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<AdaptationSet> adaptationSets) {
public Period(String id, long startMs, List<AdaptationSet> adaptationSets) {
this.id = id;
this.startMs = start;
this.startMs = startMs;
this.adaptationSets = Collections.unmodifiableList(adaptationSets);
}