Commit 6b81d9e7 by olly Committed by Oliver Woodman

Fix DownloadHelper for some HLS streams

onContinueLoadingRequested can occur during preparation, so
MediaPreparer needs to handle it.

PiperOrigin-RevId: 232507267
parent 589af35c
...@@ -744,6 +744,7 @@ public final class DownloadHelper { ...@@ -744,6 +744,7 @@ public final class DownloadHelper {
private static final int MESSAGE_PREPARE_SOURCE = 0; private static final int MESSAGE_PREPARE_SOURCE = 0;
private static final int MESSAGE_CHECK_FOR_FAILURE = 1; private static final int MESSAGE_CHECK_FOR_FAILURE = 1;
private static final int MESSAGE_CONTINUE_LOADING = 2;
private final MediaSource mediaSource; private final MediaSource mediaSource;
private final DownloadHelper downloadHelper; private final DownloadHelper downloadHelper;
...@@ -755,7 +756,7 @@ public final class DownloadHelper { ...@@ -755,7 +756,7 @@ public final class DownloadHelper {
public @MonotonicNonNull Timeline timeline; public @MonotonicNonNull Timeline timeline;
public MediaPeriod @MonotonicNonNull [] mediaPeriods; public MediaPeriod @MonotonicNonNull [] mediaPeriods;
private int pendingPreparations; private final ArrayList<MediaPeriod> pendingMediaPeriods;
public MediaPreparer(MediaSource mediaSource, DownloadHelper downloadHelper) { public MediaPreparer(MediaSource mediaSource, DownloadHelper downloadHelper) {
this.mediaSource = mediaSource; this.mediaSource = mediaSource;
...@@ -765,6 +766,7 @@ public final class DownloadHelper { ...@@ -765,6 +766,7 @@ public final class DownloadHelper {
mediaSourceThread.start(); mediaSourceThread.start();
mediaSourceHandler = Util.createHandler(mediaSourceThread.getLooper(), /* callback= */ this); mediaSourceHandler = Util.createHandler(mediaSourceThread.getLooper(), /* callback= */ this);
mediaSourceHandler.sendEmptyMessage(MESSAGE_PREPARE_SOURCE); mediaSourceHandler.sendEmptyMessage(MESSAGE_PREPARE_SOURCE);
pendingMediaPeriods = new ArrayList<>();
} }
public void release() { public void release() {
...@@ -791,8 +793,8 @@ public final class DownloadHelper { ...@@ -791,8 +793,8 @@ public final class DownloadHelper {
if (mediaPeriods == null) { if (mediaPeriods == null) {
mediaSource.maybeThrowSourceInfoRefreshError(); mediaSource.maybeThrowSourceInfoRefreshError();
} else { } else {
for (MediaPeriod mediaPeriod : mediaPeriods) { for (int i = 0; i < pendingMediaPeriods.size(); i++) {
mediaPeriod.maybeThrowPrepareError(); pendingMediaPeriods.get(i).maybeThrowPrepareError();
} }
} }
mediaSourceHandler.sendEmptyMessageDelayed( mediaSourceHandler.sendEmptyMessageDelayed(
...@@ -801,6 +803,12 @@ public final class DownloadHelper { ...@@ -801,6 +803,12 @@ public final class DownloadHelper {
downloadHelper.onMediaPreparationFailed(e); downloadHelper.onMediaPreparationFailed(e);
} }
return true; return true;
case MESSAGE_CONTINUE_LOADING:
MediaPeriod mediaPeriod = (MediaPeriod) msg.obj;
if (pendingMediaPeriods.contains(mediaPeriod)) {
mediaPeriod.continueLoading(/* positionUs= */ 0);
}
return true;
default: default:
return false; return false;
} }
...@@ -818,14 +826,15 @@ public final class DownloadHelper { ...@@ -818,14 +826,15 @@ public final class DownloadHelper {
this.timeline = timeline; this.timeline = timeline;
this.manifest = manifest; this.manifest = manifest;
mediaPeriods = new MediaPeriod[timeline.getPeriodCount()]; mediaPeriods = new MediaPeriod[timeline.getPeriodCount()];
pendingPreparations = mediaPeriods.length;
for (int i = 0; i < mediaPeriods.length; i++) { for (int i = 0; i < mediaPeriods.length; i++) {
mediaPeriods[i] = MediaPeriod mediaPeriod =
mediaSource.createPeriod( mediaSource.createPeriod(
new MediaPeriodId(timeline.getUidOfPeriod(/* periodIndex= */ i)), new MediaPeriodId(timeline.getUidOfPeriod(/* periodIndex= */ i)),
allocator, allocator,
/* startPositionUs= */ 0); /* 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 { ...@@ -833,16 +842,18 @@ public final class DownloadHelper {
@Override @Override
public void onPrepared(MediaPeriod mediaPeriod) { public void onPrepared(MediaPeriod mediaPeriod) {
pendingPreparations--; pendingMediaPeriods.remove(mediaPeriod);
if (pendingPreparations == 0) { if (pendingMediaPeriods.isEmpty()) {
mediaSourceHandler.removeMessages(MESSAGE_CHECK_FOR_FAILURE); mediaSourceHandler.removeMessages(MESSAGE_CHECK_FOR_FAILURE);
downloadHelper.onMediaPrepared(); downloadHelper.onMediaPrepared();
} }
} }
@Override @Override
public void onContinueLoadingRequested(MediaPeriod source) { public void onContinueLoadingRequested(MediaPeriod mediaPeriod) {
// Ignore. if (pendingMediaPeriods.contains(mediaPeriod)) {
mediaSourceHandler.obtainMessage(MESSAGE_CONTINUE_LOADING, mediaPeriod).sendToTarget();
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment