From 6b81d9e7a4f6c8cfdc309c4c61af362fe03051c3 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 5 Feb 2019 18:04:25 +0000 Subject: [PATCH] Fix DownloadHelper for some HLS streams onContinueLoadingRequested can occur during preparation, so MediaPreparer needs to handle it. PiperOrigin-RevId: 232507267 --- .../exoplayer2/offline/DownloadHelper.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index 25c4eca5eb..d12013673f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -744,6 +744,7 @@ public final class DownloadHelper { private static final int MESSAGE_PREPARE_SOURCE = 0; private static final int MESSAGE_CHECK_FOR_FAILURE = 1; + private static final int MESSAGE_CONTINUE_LOADING = 2; private final MediaSource mediaSource; private final DownloadHelper downloadHelper; @@ -755,7 +756,7 @@ public final class DownloadHelper { public @MonotonicNonNull Timeline timeline; public MediaPeriod @MonotonicNonNull [] mediaPeriods; - private int pendingPreparations; + private final ArrayList pendingMediaPeriods; public MediaPreparer(MediaSource mediaSource, DownloadHelper downloadHelper) { this.mediaSource = mediaSource; @@ -765,6 +766,7 @@ public final class DownloadHelper { mediaSourceThread.start(); mediaSourceHandler = Util.createHandler(mediaSourceThread.getLooper(), /* callback= */ this); mediaSourceHandler.sendEmptyMessage(MESSAGE_PREPARE_SOURCE); + pendingMediaPeriods = new ArrayList<>(); } public void release() { @@ -791,8 +793,8 @@ public final class DownloadHelper { if (mediaPeriods == null) { mediaSource.maybeThrowSourceInfoRefreshError(); } else { - for (MediaPeriod mediaPeriod : mediaPeriods) { - mediaPeriod.maybeThrowPrepareError(); + for (int i = 0; i < pendingMediaPeriods.size(); i++) { + pendingMediaPeriods.get(i).maybeThrowPrepareError(); } } mediaSourceHandler.sendEmptyMessageDelayed( @@ -801,6 +803,12 @@ public final class DownloadHelper { downloadHelper.onMediaPreparationFailed(e); } return true; + case MESSAGE_CONTINUE_LOADING: + MediaPeriod mediaPeriod = (MediaPeriod) msg.obj; + if (pendingMediaPeriods.contains(mediaPeriod)) { + mediaPeriod.continueLoading(/* positionUs= */ 0); + } + return true; default: return false; } @@ -818,14 +826,15 @@ public final class DownloadHelper { this.timeline = timeline; this.manifest = manifest; mediaPeriods = new MediaPeriod[timeline.getPeriodCount()]; - pendingPreparations = mediaPeriods.length; for (int i = 0; i < mediaPeriods.length; i++) { - mediaPeriods[i] = + MediaPeriod mediaPeriod = mediaSource.createPeriod( new MediaPeriodId(timeline.getUidOfPeriod(/* periodIndex= */ i)), allocator, /* startPositionUs= */ 0); - mediaPeriods[i].prepare(/* callback= */ this, /* positionUs= */ 0); + mediaPeriods[i] = mediaPeriod; + pendingMediaPeriods.add(mediaPeriod); + mediaPeriod.prepare(/* callback= */ this, /* positionUs= */ 0); } } @@ -833,16 +842,18 @@ public final class DownloadHelper { @Override public void onPrepared(MediaPeriod mediaPeriod) { - pendingPreparations--; - if (pendingPreparations == 0) { + pendingMediaPeriods.remove(mediaPeriod); + if (pendingMediaPeriods.isEmpty()) { mediaSourceHandler.removeMessages(MESSAGE_CHECK_FOR_FAILURE); downloadHelper.onMediaPrepared(); } } @Override - public void onContinueLoadingRequested(MediaPeriod source) { - // Ignore. + public void onContinueLoadingRequested(MediaPeriod mediaPeriod) { + if (pendingMediaPeriods.contains(mediaPeriod)) { + mediaSourceHandler.obtainMessage(MESSAGE_CONTINUE_LOADING, mediaPeriod).sendToTarget(); + } } }