DownloadHelper: propagate errors to callback

When downlading an adaptive asset, if an ExoPlaybackException happens
during track selection, the player raises an
UnsupportedOperationException which is not handled gracefully and can
crash the app main thread.

This change catches the error and forwards it to
DownloadHelper.Callback.onPrepareError() as an IOException.

PiperOrigin-RevId: 443015332
This commit is contained in:
christosts 2022-04-20 08:24:21 +01:00 committed by Ian Baker
parent d1f8e96d9c
commit 63052e1a7c

View File

@ -622,9 +622,13 @@ public final class DownloadHelper {
*/
public void replaceTrackSelections(
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
try {
assertPreparedWithMedia();
clearTrackSelections(periodIndex);
addTrackSelectionInternal(periodIndex, trackSelectionParameters);
} catch (ExoPlaybackException e) {
throw new IllegalStateException(e);
}
}
/**
@ -637,8 +641,12 @@ public final class DownloadHelper {
*/
public void addTrackSelection(
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
try {
assertPreparedWithMedia();
addTrackSelectionInternal(periodIndex, trackSelectionParameters);
} catch (ExoPlaybackException e) {
throw new IllegalStateException(e);
}
}
/**
@ -650,6 +658,7 @@ public final class DownloadHelper {
* selection, as IETF BCP 47 conformant tags.
*/
public void addAudioLanguagesToSelection(String... languages) {
try {
assertPreparedWithMedia();
TrackSelectionParameters.Builder parametersBuilder =
@ -672,6 +681,9 @@ public final class DownloadHelper {
addTrackSelectionInternal(periodIndex, parameters);
}
}
} catch (ExoPlaybackException e) {
throw new IllegalStateException(e);
}
}
/**
@ -686,6 +698,7 @@ public final class DownloadHelper {
*/
public void addTextLanguagesToSelection(
boolean selectUndeterminedTextLanguage, String... languages) {
try {
assertPreparedWithMedia();
TrackSelectionParameters.Builder parametersBuilder =
@ -709,6 +722,9 @@ public final class DownloadHelper {
addTrackSelectionInternal(periodIndex, parameters);
}
}
} catch (ExoPlaybackException e) {
throw new IllegalStateException(e);
}
}
/**
@ -727,6 +743,7 @@ public final class DownloadHelper {
int rendererIndex,
DefaultTrackSelector.Parameters trackSelectorParameters,
List<SelectionOverride> overrides) {
try {
assertPreparedWithMedia();
DefaultTrackSelector.ParametersBuilder builder = trackSelectorParameters.buildUpon();
for (int i = 0; i < mappedTrackInfos[periodIndex].getRendererCount(); i++) {
@ -735,12 +752,16 @@ public final class DownloadHelper {
if (overrides.isEmpty()) {
addTrackSelectionInternal(periodIndex, builder.build());
} else {
TrackGroupArray trackGroupArray = mappedTrackInfos[periodIndex].getTrackGroups(rendererIndex);
TrackGroupArray trackGroupArray =
mappedTrackInfos[periodIndex].getTrackGroups(rendererIndex);
for (int i = 0; i < overrides.size(); i++) {
builder.setSelectionOverride(rendererIndex, trackGroupArray, overrides.get(i));
addTrackSelectionInternal(periodIndex, builder.build());
}
}
} catch (ExoPlaybackException e) {
throw new IllegalStateException(e);
}
}
/**
@ -797,7 +818,8 @@ public final class DownloadHelper {
"mediaPreparer.timeline"
})
private void addTrackSelectionInternal(
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
int periodIndex, TrackSelectionParameters trackSelectionParameters)
throws ExoPlaybackException {
trackSelector.setParameters(trackSelectionParameters);
runTrackSelection(periodIndex);
// TrackSelectionParameters can contain multiple overrides for each track type. The track
@ -812,7 +834,7 @@ public final class DownloadHelper {
}
@SuppressWarnings("unchecked") // Initialization of array of Lists.
private void onMediaPrepared() {
private void onMediaPrepared() throws ExoPlaybackException {
checkNotNull(mediaPreparer);
checkNotNull(mediaPreparer.mediaPeriods);
checkNotNull(mediaPreparer.timeline);
@ -882,8 +904,7 @@ public final class DownloadHelper {
"mediaPreparer",
"mediaPreparer.timeline"
})
private TrackSelectorResult runTrackSelection(int periodIndex) {
try {
private TrackSelectorResult runTrackSelection(int periodIndex) throws ExoPlaybackException {
TrackSelectorResult trackSelectorResult =
trackSelector.selectTracks(
rendererCapabilities,
@ -924,10 +945,6 @@ public final class DownloadHelper {
}
}
return trackSelectorResult;
} catch (ExoPlaybackException e) {
// DefaultTrackSelector does not throw exceptions during track selection.
throw new UnsupportedOperationException(e);
}
}
private static MediaSource createMediaSourceInternal(
@ -1098,7 +1115,14 @@ public final class DownloadHelper {
}
switch (msg.what) {
case DOWNLOAD_HELPER_CALLBACK_MESSAGE_PREPARED:
try {
downloadHelper.onMediaPrepared();
} catch (ExoPlaybackException e) {
downloadHelperHandler
.obtainMessage(
DOWNLOAD_HELPER_CALLBACK_MESSAGE_FAILED, /* obj= */ new IOException(e))
.sendToTarget();
}
return true;
case DOWNLOAD_HELPER_CALLBACK_MESSAGE_FAILED:
release();