DefaultAudioSink: Fix transient position calculation errors
PiperOrigin-RevId: 344408351
This commit is contained in:
parent
43713abe79
commit
dd0246a31c
@ -1407,21 +1407,33 @@ public final class DefaultAudioSink implements AudioSink {
|
|||||||
mediaPositionParameters = mediaPositionParametersCheckpoints.remove();
|
mediaPositionParameters = mediaPositionParametersCheckpoints.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
long playoutDurationSinceLastCheckpoint =
|
long playoutDurationSinceLastCheckpointUs =
|
||||||
positionUs - mediaPositionParameters.audioTrackPositionUs;
|
positionUs - mediaPositionParameters.audioTrackPositionUs;
|
||||||
if (!mediaPositionParameters.playbackParameters.equals(PlaybackParameters.DEFAULT)) {
|
if (mediaPositionParameters.playbackParameters.equals(PlaybackParameters.DEFAULT)) {
|
||||||
if (mediaPositionParametersCheckpoints.isEmpty()) {
|
return mediaPositionParameters.mediaTimeUs + playoutDurationSinceLastCheckpointUs;
|
||||||
playoutDurationSinceLastCheckpoint =
|
} else if (mediaPositionParametersCheckpoints.isEmpty()) {
|
||||||
audioProcessorChain.getMediaDuration(playoutDurationSinceLastCheckpoint);
|
long mediaDurationSinceLastCheckpointUs =
|
||||||
} else {
|
audioProcessorChain.getMediaDuration(playoutDurationSinceLastCheckpointUs);
|
||||||
// Playing data at a previous playback speed, so fall back to multiplying by the speed.
|
return mediaPositionParameters.mediaTimeUs + mediaDurationSinceLastCheckpointUs;
|
||||||
playoutDurationSinceLastCheckpoint =
|
} else {
|
||||||
Util.getMediaDurationForPlayoutDuration(
|
// The processor chain has been configured with new parameters, but we're still playing audio
|
||||||
playoutDurationSinceLastCheckpoint,
|
// that was processed using previous parameters. We can't scale the playout duration using the
|
||||||
mediaPositionParameters.playbackParameters.speed);
|
// processor chain in this case, so we fall back to scaling using the previous parameters'
|
||||||
}
|
// target speed instead. Since the processor chain may not have achieved the target speed
|
||||||
|
// precisely, we scale the duration to the next checkpoint (which will always be small) rather
|
||||||
|
// than the duration from the previous checkpoint (which may be arbitrarily large). This
|
||||||
|
// limits the amount of error that can be introduced due to a difference between the target
|
||||||
|
// and actual speeds.
|
||||||
|
MediaPositionParameters nextMediaPositionParameters =
|
||||||
|
mediaPositionParametersCheckpoints.getFirst();
|
||||||
|
long playoutDurationUntilNextCheckpointUs =
|
||||||
|
nextMediaPositionParameters.audioTrackPositionUs - positionUs;
|
||||||
|
long mediaDurationUntilNextCheckpointUs =
|
||||||
|
Util.getMediaDurationForPlayoutDuration(
|
||||||
|
playoutDurationUntilNextCheckpointUs,
|
||||||
|
mediaPositionParameters.playbackParameters.speed);
|
||||||
|
return nextMediaPositionParameters.mediaTimeUs - mediaDurationUntilNextCheckpointUs;
|
||||||
}
|
}
|
||||||
return mediaPositionParameters.mediaTimeUs + playoutDurationSinceLastCheckpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private long applySkipping(long positionUs) {
|
private long applySkipping(long positionUs) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user