From 03305c92cf41acb88565d2dc9cc81f6323c77aec Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Thu, 23 Jul 2015 13:44:52 +0100 Subject: [PATCH] Modified timing of manifest fetches to compensate for drift due to fetch time. --- .../demo/player/DashRendererBuilder.java | 2 +- .../exoplayer/dash/DashChunkSource.java | 2 +- .../SmoothStreamingChunkSource.java | 2 +- .../exoplayer/util/ManifestFetcher.java | 32 +++++++++++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java index 8f1d738064..e2c7d564d6 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java @@ -134,7 +134,7 @@ public class DashRendererBuilder implements RendererBuilder, this.manifest = manifest; if (manifest.dynamic && manifest.utcTiming != null) { UtcTimingElementResolver.resolveTimingElement(manifestDataSource, manifest.utcTiming, - manifestFetcher.getManifestLoadTimestamp(), this); + manifestFetcher.getManifestLoadCompleteTimestamp(), this); } else { buildRenderers(); } diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index e2d63580dc..b4b0279052 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -386,7 +386,7 @@ public class DashChunkSource implements ChunkSource { } if (finishedCurrentManifest && (android.os.SystemClock.elapsedRealtime() - > manifestFetcher.getManifestLoadTimestamp() + minUpdatePeriod)) { + > manifestFetcher.getManifestLoadStartTimestamp() + minUpdatePeriod)) { manifestFetcher.requestRefresh(); } } diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java index aca3994e22..9849b3d323 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java @@ -239,7 +239,7 @@ public class SmoothStreamingChunkSource implements ChunkSource { } if (finishedCurrentManifest && (SystemClock.elapsedRealtime() - > manifestFetcher.getManifestLoadTimestamp() + MINIMUM_MANIFEST_REFRESH_PERIOD_MS)) { + > manifestFetcher.getManifestLoadStartTimestamp() + MINIMUM_MANIFEST_REFRESH_PERIOD_MS)) { manifestFetcher.requestRefresh(); } } diff --git a/library/src/main/java/com/google/android/exoplayer/util/ManifestFetcher.java b/library/src/main/java/com/google/android/exoplayer/util/ManifestFetcher.java index c1b73d11cf..d50b5be27f 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/ManifestFetcher.java +++ b/library/src/main/java/com/google/android/exoplayer/util/ManifestFetcher.java @@ -108,13 +108,15 @@ public class ManifestFetcher implements Loader.Callback { private int enabledCount; private Loader loader; private UriLoadable currentLoadable; + private long currentLoadStartTimestamp; private int loadExceptionCount; private long loadExceptionTimestamp; private IOException loadException; private volatile T manifest; - private volatile long manifestLoadTimestamp; + private volatile long manifestLoadStartTimestamp; + private volatile long manifestLoadCompleteTimestamp; /** * @param manifestUri The manifest location. @@ -176,13 +178,23 @@ public class ManifestFetcher implements Loader.Callback { return manifest; } + /** + * Gets the value of {@link SystemClock#elapsedRealtime()} when the last completed load started. + * + * @return The value of {@link SystemClock#elapsedRealtime()} when the last completed load + * started. + */ + public long getManifestLoadStartTimestamp() { + return manifestLoadStartTimestamp; + } + /** * Gets the value of {@link SystemClock#elapsedRealtime()} when the last load completed. * * @return The value of {@link SystemClock#elapsedRealtime()} when the last load completed. */ - public long getManifestLoadTimestamp() { - return manifestLoadTimestamp; + public long getManifestLoadCompleteTimestamp() { + return manifestLoadCompleteTimestamp; } /** @@ -235,6 +247,7 @@ public class ManifestFetcher implements Loader.Callback { } if (!loader.isLoading()) { currentLoadable = new UriLoadable<>(manifestUri, uriDataSource, parser); + currentLoadStartTimestamp = SystemClock.elapsedRealtime(); loader.startLoading(currentLoadable, this); notifyManifestRefreshStarted(); } @@ -248,7 +261,8 @@ public class ManifestFetcher implements Loader.Callback { } manifest = currentLoadable.getResult(); - manifestLoadTimestamp = SystemClock.elapsedRealtime(); + manifestLoadStartTimestamp = currentLoadStartTimestamp; + manifestLoadCompleteTimestamp = SystemClock.elapsedRealtime(); loadExceptionCount = 0; loadException = null; @@ -282,9 +296,10 @@ public class ManifestFetcher implements Loader.Callback { notifyManifestError(loadException); } - /* package */ void onSingleFetchCompleted(T result) { + /* package */ void onSingleFetchCompleted(T result, long loadStartTimestamp) { manifest = result; - manifestLoadTimestamp = SystemClock.elapsedRealtime(); + manifestLoadStartTimestamp = loadStartTimestamp; + manifestLoadCompleteTimestamp = SystemClock.elapsedRealtime(); } private long getRetryDelayMillis(long errorCount) { @@ -331,6 +346,8 @@ public class ManifestFetcher implements Loader.Callback { private final ManifestCallback wrappedCallback; private final Loader singleUseLoader; + private long loadStartTimestamp; + public SingleFetchHelper(UriLoadable singleUseLoadable, Looper callbackLooper, ManifestCallback wrappedCallback) { this.singleUseLoadable = singleUseLoadable; @@ -340,6 +357,7 @@ public class ManifestFetcher implements Loader.Callback { } public void startLoading() { + loadStartTimestamp = SystemClock.elapsedRealtime(); singleUseLoader.startLoading(callbackLooper, singleUseLoadable, this); } @@ -347,7 +365,7 @@ public class ManifestFetcher implements Loader.Callback { public void onLoadCompleted(Loadable loadable) { try { T result = singleUseLoadable.getResult(); - onSingleFetchCompleted(result); + onSingleFetchCompleted(result, loadStartTimestamp); wrappedCallback.onSingleManifest(result); } finally { releaseLoader();