mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Use ExoPlaybackException.MediaPeriodId in prewarming error handling
With using the `MediaPeriodId` from the `ExoPlaybackException`, ExoPlayerImplInternal can set the same id to the renderer group(primary and secondary). Tested with `ExoPlayerWithPrewarmingRenderersTest` error-based unit tests like `play_errorByPrewarmingSecondaryRendererAfterAdvancingReadingPeriod_doesNotResetPrimaryRenderer`. If the media period was not set in BaseRenderer then the exception would have the incorrect mediaperiod, attribute the error to the non-prewarming renderer, and the test would fail. PiperOrigin-RevId: 733744777
This commit is contained in:
parent
bc9a974e07
commit
d7163534ff
@ -311,7 +311,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
rendererCapabilities[i].setListener(rendererCapabilitiesListener);
|
rendererCapabilities[i].setListener(rendererCapabilitiesListener);
|
||||||
}
|
}
|
||||||
if (secondaryRenderers[i] != null) {
|
if (secondaryRenderers[i] != null) {
|
||||||
secondaryRenderers[i].init(/* index= */ i + renderers.length, playerId, clock);
|
secondaryRenderers[i].init(/* index= */ i, playerId, clock);
|
||||||
hasSecondaryRenderers = true;
|
hasSecondaryRenderers = true;
|
||||||
}
|
}
|
||||||
this.renderers[i] = new RendererHolder(renderers[i], secondaryRenderers[i], /* index= */ i);
|
this.renderers[i] = new RendererHolder(renderers[i], secondaryRenderers[i], /* index= */ i);
|
||||||
@ -741,13 +741,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
if (readingPeriod != null && e.mediaPeriodId == null) {
|
if (readingPeriod != null && e.mediaPeriodId == null) {
|
||||||
// We can assume that all renderer errors happen in the context of the reading period. See
|
// We can assume that all renderer errors happen in the context of the reading period. See
|
||||||
// [internal: b/150584930#comment4] for exceptions that aren't covered by this assumption.
|
// [internal: b/150584930#comment4] for exceptions that aren't covered by this assumption.
|
||||||
e =
|
e = e.copyWithMediaPeriodId(readingPeriod.info.id);
|
||||||
e.copyWithMediaPeriodId(
|
|
||||||
(renderers[e.rendererIndex % renderers.length].isRendererPrewarming(
|
|
||||||
e.rendererIndex)
|
|
||||||
&& readingPeriod.getNext() != null)
|
|
||||||
? readingPeriod.getNext().info.id
|
|
||||||
: readingPeriod.info.id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (e.isRecoverable
|
if (e.isRecoverable
|
||||||
@ -769,8 +763,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
handler.sendMessageAtFrontOfQueue(
|
handler.sendMessageAtFrontOfQueue(
|
||||||
handler.obtainMessage(MSG_ATTEMPT_RENDERER_ERROR_RECOVERY, e));
|
handler.obtainMessage(MSG_ATTEMPT_RENDERER_ERROR_RECOVERY, e));
|
||||||
} else if (e.type == ExoPlaybackException.TYPE_RENDERER
|
} else if (e.type == ExoPlaybackException.TYPE_RENDERER
|
||||||
&& renderers[e.rendererIndex % renderers.length].isRendererPrewarming(
|
&& e.mediaPeriodId != null
|
||||||
/* id= */ e.rendererIndex)) {
|
&& isRendererPrewarmingMediaPeriod(e.rendererIndex, e.mediaPeriodId)) {
|
||||||
// TODO(b/380273486): Investigate recovery for pre-warming renderer errors
|
// TODO(b/380273486): Investigate recovery for pre-warming renderer errors
|
||||||
isPrewarmingDisabledUntilNextTransition = true;
|
isPrewarmingDisabledUntilNextTransition = true;
|
||||||
disableAndResetPrewarmingRenderers();
|
disableAndResetPrewarmingRenderers();
|
||||||
@ -2080,6 +2074,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
prewarmingMediaPeriodDiscontinuity = C.TIME_UNSET;
|
prewarmingMediaPeriodDiscontinuity = C.TIME_UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isRendererPrewarmingMediaPeriod(int rendererIndex, MediaPeriodId mediaPeriodId) {
|
||||||
|
if (queue.getPrewarmingPeriod() == null
|
||||||
|
|| !queue.getPrewarmingPeriod().info.id.equals(mediaPeriodId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return renderers[rendererIndex].isPrewarmingPeriod(queue.getPrewarmingPeriod());
|
||||||
|
}
|
||||||
|
|
||||||
private void reselectTracksInternalAndSeek() throws ExoPlaybackException {
|
private void reselectTracksInternalAndSeek() throws ExoPlaybackException {
|
||||||
reselectTracksInternal();
|
reselectTracksInternal();
|
||||||
seekToCurrentPosition(/* sendDiscontinuity= */ true);
|
seekToCurrentPosition(/* sendDiscontinuity= */ true);
|
||||||
|
@ -82,12 +82,6 @@ import java.util.Objects;
|
|||||||
return isPrimaryRendererPrewarming() || isSecondaryRendererPrewarming();
|
return isPrimaryRendererPrewarming() || isSecondaryRendererPrewarming();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRendererPrewarming(int id) {
|
|
||||||
boolean isPrewarmingPrimaryRenderer = isPrimaryRendererPrewarming() && id == index;
|
|
||||||
boolean isPrewarmingSecondaryRenderer = isSecondaryRendererPrewarming() && id != index;
|
|
||||||
return isPrewarmingPrimaryRenderer || isPrewarmingSecondaryRenderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isPrimaryRendererPrewarming() {
|
private boolean isPrimaryRendererPrewarming() {
|
||||||
return prewarmingState == RENDERER_PREWARMING_STATE_PREWARMING_PRIMARY
|
return prewarmingState == RENDERER_PREWARMING_STATE_PREWARMING_PRIMARY
|
||||||
|| prewarmingState == RENDERER_PREWARMING_STATE_TRANSITIONING_TO_PRIMARY;
|
|| prewarmingState == RENDERER_PREWARMING_STATE_TRANSITIONING_TO_PRIMARY;
|
||||||
@ -317,6 +311,21 @@ import java.util.Objects;
|
|||||||
return getRendererReadingFromPeriod(period) != null;
|
return getRendererReadingFromPeriod(period) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether a {@link Renderer} is prewarming and enabled on a {@link MediaPeriodHolder
|
||||||
|
* media period}.
|
||||||
|
*
|
||||||
|
* @param period The {@link MediaPeriodHolder media period} to check.
|
||||||
|
*/
|
||||||
|
public boolean isPrewarmingPeriod(MediaPeriodHolder period) {
|
||||||
|
boolean isPrimaryRendererPrewarming =
|
||||||
|
isPrimaryRendererPrewarming() && getRendererReadingFromPeriod(period) == primaryRenderer;
|
||||||
|
boolean isSecondaryRendererPrewarming =
|
||||||
|
isSecondaryRendererPrewarming()
|
||||||
|
&& getRendererReadingFromPeriod(period) == secondaryRenderer;
|
||||||
|
return isPrimaryRendererPrewarming || isSecondaryRendererPrewarming;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the {@link Renderer renderers} are still reading a {@link MediaPeriodHolder
|
* Returns whether the {@link Renderer renderers} are still reading a {@link MediaPeriodHolder
|
||||||
* media period}.
|
* media period}.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user