Skip to content

Instantly share code, notes, and snippets.

@martinbonnin
Created August 14, 2014 08:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save martinbonnin/7ad13c83f59684ad5de9 to your computer and use it in GitHub Desktop.
Save martinbonnin/7ad13c83f59684ad5de9 to your computer and use it in GitHub Desktop.
diff --git a/library/src/main/java/com/google/android/exoplayer/ExoPlayerImplInternal.java b/library/src/main/java/com/google/android/exoplayer/ExoPlayerImplInternal.java
index c6858ee..33fd681 100644
--- a/library/src/main/java/com/google/android/exoplayer/ExoPlayerImplInternal.java
+++ b/library/src/main/java/com/google/android/exoplayer/ExoPlayerImplInternal.java
@@ -259,6 +259,27 @@ import java.util.List;
handler.sendEmptyMessage(MSG_INCREMENTAL_PREPARE);
}
+ private void updateDuration() {
+ long durationUs = 0;
+ for (int i = 0; i < renderers.length; i++) {
+ TrackRenderer renderer = renderers[i];
+ if (durationUs == TrackRenderer.UNKNOWN_TIME) {
+ // We've already encountered a track for which the duration is unknown, so the media
+ // duration is unknown regardless of the duration of this track.
+ } else {
+ long trackDurationUs = renderer.getDurationUs();
+ if (trackDurationUs == TrackRenderer.UNKNOWN_TIME) {
+ durationUs = TrackRenderer.UNKNOWN_TIME;
+ } else if (trackDurationUs == TrackRenderer.MATCH_LONGEST) {
+ // Do nothing.
+ } else {
+ durationUs = Math.max(durationUs, trackDurationUs);
+ }
+ }
+ this.durationUs = durationUs;
+ }
+ }
+
private void incrementalPrepareInternal() throws ExoPlaybackException {
long operationStartTimeMs = SystemClock.elapsedRealtime();
boolean prepared = true;
@@ -303,6 +324,7 @@ import java.util.List;
}
}
this.durationUs = durationUs;
+ updateDuration();
if (isEnded) {
// We don't expect this case, but handle it anyway.
@@ -417,6 +439,7 @@ import java.util.List;
}
}
this.bufferedPositionUs = bufferedPositionUs;
+ updateDuration();
if (isEnded) {
setState(ExoPlayer.STATE_ENDED);
diff --git a/library/src/main/java/com/google/android/exoplayer/TrackInfo.java b/library/src/main/java/com/google/android/exoplayer/TrackInfo.java
index e6c1b0c..c1156f5 100644
--- a/library/src/main/java/com/google/android/exoplayer/TrackInfo.java
+++ b/library/src/main/java/com/google/android/exoplayer/TrackInfo.java
@@ -21,7 +21,7 @@ package com.google.android.exoplayer;
public final class TrackInfo {
public final String mimeType;
- public final long durationUs;
+ public long durationUs;
public TrackInfo(String mimeType, long durationUs) {
this.mimeType = mimeType;
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 e25b703..de1f0a3 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
@@ -687,6 +687,13 @@ public class HLSSampleSource implements SampleSource {
HLSSampleSource source = HLSSampleSource.this;
if (exception == null) {
source.variantPlaylistsMap.get(currentEntry).playlist = this.variantPlaylist;
+ long durationUs = trackList.get(0).trackInfo.durationUs;
+ for (int i = this.variantPlaylist.entries.size() - 1; i > source.sequence; i--) {
+ durationUs += this.variantPlaylist.entries.get(i).extinf;
+ }
+ for (HLSTrack hlsTrack: trackList) {
+ hlsTrack.trackInfo.durationUs = durationUs;
+ }
}
source.variantPlaylistTask = null;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment