提交 ed3d1c62 编写于 作者: A andrewlewis 提交者: Oliver Woodman

Don't set playback parameters when using tunneling

Issue: #4803

PiperOrigin-RevId: 356923345
上级 d0dd33e5
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
* Core library: * Core library:
* Fix playback issue for HLS live streams without program date time * Fix playback issue for HLS live streams without program date time
information ([#8560](https://github.com/google/ExoPlayer/issues/8560)). information ([#8560](https://github.com/google/ExoPlayer/issues/8560)).
* Fix a bug where setting playback parameters while using video tunneling
would cause an error to be thrown
([#8570](https://github.com/google/ExoPlayer/issues/8570)).
* IMA extension: * IMA extension:
* Fix handling of repeated ad loads, to avoid ads being discarded if the * Fix handling of repeated ad loads, to avoid ads being discarded if the
user seeks away and then back to a preloaded postroll (for example). user seeks away and then back to a preloaded postroll (for example).
......
...@@ -488,7 +488,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -488,7 +488,6 @@ public final class DefaultAudioSink implements AudioSink {
throws ConfigurationException { throws ConfigurationException {
int inputPcmFrameSize; int inputPcmFrameSize;
@Nullable AudioProcessor[] availableAudioProcessors; @Nullable AudioProcessor[] availableAudioProcessors;
boolean canApplyPlaybackParameters;
@OutputMode int outputMode; @OutputMode int outputMode;
@C.Encoding int outputEncoding; @C.Encoding int outputEncoding;
...@@ -500,11 +499,10 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -500,11 +499,10 @@ public final class DefaultAudioSink implements AudioSink {
Assertions.checkArgument(Util.isEncodingLinearPcm(inputFormat.pcmEncoding)); Assertions.checkArgument(Util.isEncodingLinearPcm(inputFormat.pcmEncoding));
inputPcmFrameSize = Util.getPcmFrameSize(inputFormat.pcmEncoding, inputFormat.channelCount); inputPcmFrameSize = Util.getPcmFrameSize(inputFormat.pcmEncoding, inputFormat.channelCount);
boolean useFloatOutput =
enableFloatOutput && Util.isEncodingHighResolutionPcm(inputFormat.pcmEncoding);
availableAudioProcessors = availableAudioProcessors =
useFloatOutput ? toFloatPcmAvailableAudioProcessors : toIntPcmAvailableAudioProcessors; shouldUseFloatOutput(inputFormat.pcmEncoding)
canApplyPlaybackParameters = !useFloatOutput; ? toFloatPcmAvailableAudioProcessors
: toIntPcmAvailableAudioProcessors;
trimmingAudioProcessor.setTrimFrameCount( trimmingAudioProcessor.setTrimFrameCount(
inputFormat.encoderDelay, inputFormat.encoderPadding); inputFormat.encoderDelay, inputFormat.encoderPadding);
...@@ -541,7 +539,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -541,7 +539,6 @@ public final class DefaultAudioSink implements AudioSink {
} else { } else {
inputPcmFrameSize = C.LENGTH_UNSET; inputPcmFrameSize = C.LENGTH_UNSET;
availableAudioProcessors = new AudioProcessor[0]; availableAudioProcessors = new AudioProcessor[0];
canApplyPlaybackParameters = false;
outputSampleRate = inputFormat.sampleRate; outputSampleRate = inputFormat.sampleRate;
outputPcmFrameSize = C.LENGTH_UNSET; outputPcmFrameSize = C.LENGTH_UNSET;
if (enableOffload && isOffloadedPlaybackSupported(inputFormat, audioAttributes)) { if (enableOffload && isOffloadedPlaybackSupported(inputFormat, audioAttributes)) {
...@@ -586,7 +583,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -586,7 +583,6 @@ public final class DefaultAudioSink implements AudioSink {
outputEncoding, outputEncoding,
specifiedBufferSize, specifiedBufferSize,
enableAudioTrackPlaybackParams, enableAudioTrackPlaybackParams,
canApplyPlaybackParameters,
availableAudioProcessors); availableAudioProcessors);
if (isAudioTrackInitialized()) { if (isAudioTrackInitialized()) {
this.pendingConfiguration = pendingConfiguration; this.pendingConfiguration = pendingConfiguration;
...@@ -1336,11 +1332,11 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1336,11 +1332,11 @@ public final class DefaultAudioSink implements AudioSink {
private void applyAudioProcessorPlaybackParametersAndSkipSilence(long presentationTimeUs) { private void applyAudioProcessorPlaybackParametersAndSkipSilence(long presentationTimeUs) {
PlaybackParameters playbackParameters = PlaybackParameters playbackParameters =
configuration.canApplyPlaybackParameters shouldApplyAudioProcessorPlaybackParameters()
? audioProcessorChain.applyPlaybackParameters(getAudioProcessorPlaybackParameters()) ? audioProcessorChain.applyPlaybackParameters(getAudioProcessorPlaybackParameters())
: PlaybackParameters.DEFAULT; : PlaybackParameters.DEFAULT;
boolean skipSilenceEnabled = boolean skipSilenceEnabled =
configuration.canApplyPlaybackParameters shouldApplyAudioProcessorPlaybackParameters()
? audioProcessorChain.applySkipSilenceEnabled(getSkipSilenceEnabled()) ? audioProcessorChain.applySkipSilenceEnabled(getSkipSilenceEnabled())
: DEFAULT_SKIP_SILENCE; : DEFAULT_SKIP_SILENCE;
mediaPositionParametersCheckpoints.add( mediaPositionParametersCheckpoints.add(
...@@ -1355,6 +1351,31 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1355,6 +1351,31 @@ public final class DefaultAudioSink implements AudioSink {
} }
} }
/**
* Returns whether audio processor playback parameters should be applied in the current
* configuration.
*/
private boolean shouldApplyAudioProcessorPlaybackParameters() {
// We don't apply speed/pitch adjustment using an audio processor in the following cases:
// - in tunneling mode, because audio processing can change the duration of audio yet the video
// frame presentation times are currently not modified (see also
// https://github.com/google/ExoPlayer/issues/4803);
// - when playing encoded audio via passthrough/offload, because modifying the audio stream
// would require decoding/re-encoding; and
// - when outputting float PCM audio, because SonicAudioProcessor outputs 16-bit integer PCM.
return !tunneling
&& MimeTypes.AUDIO_RAW.equals(configuration.inputFormat.sampleMimeType)
&& !shouldUseFloatOutput(configuration.inputFormat.pcmEncoding);
}
/**
* Returns whether audio in the specified PCM encoding should be written to the audio track as
* float PCM.
*/
private boolean shouldUseFloatOutput(@C.PcmEncoding int pcmEncoding) {
return enableFloatOutput && Util.isEncodingHighResolutionPcm(pcmEncoding);
}
/** /**
* Applies and updates media position parameters. * Applies and updates media position parameters.
* *
...@@ -1897,7 +1918,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1897,7 +1918,6 @@ public final class DefaultAudioSink implements AudioSink {
public final int outputChannelConfig; public final int outputChannelConfig;
@C.Encoding public final int outputEncoding; @C.Encoding public final int outputEncoding;
public final int bufferSize; public final int bufferSize;
public final boolean canApplyPlaybackParameters;
public final AudioProcessor[] availableAudioProcessors; public final AudioProcessor[] availableAudioProcessors;
public Configuration( public Configuration(
...@@ -1910,7 +1930,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1910,7 +1930,6 @@ public final class DefaultAudioSink implements AudioSink {
int outputEncoding, int outputEncoding,
int specifiedBufferSize, int specifiedBufferSize,
boolean enableAudioTrackPlaybackParams, boolean enableAudioTrackPlaybackParams,
boolean canApplyPlaybackParameters,
AudioProcessor[] availableAudioProcessors) { AudioProcessor[] availableAudioProcessors) {
this.inputFormat = inputFormat; this.inputFormat = inputFormat;
this.inputPcmFrameSize = inputPcmFrameSize; this.inputPcmFrameSize = inputPcmFrameSize;
...@@ -1919,7 +1938,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1919,7 +1938,6 @@ public final class DefaultAudioSink implements AudioSink {
this.outputSampleRate = outputSampleRate; this.outputSampleRate = outputSampleRate;
this.outputChannelConfig = outputChannelConfig; this.outputChannelConfig = outputChannelConfig;
this.outputEncoding = outputEncoding; this.outputEncoding = outputEncoding;
this.canApplyPlaybackParameters = canApplyPlaybackParameters;
this.availableAudioProcessors = availableAudioProcessors; this.availableAudioProcessors = availableAudioProcessors;
// Call computeBufferSize() last as it depends on the other configuration values. // Call computeBufferSize() last as it depends on the other configuration values.
......
...@@ -320,6 +320,20 @@ public final class DefaultAudioSinkTest { ...@@ -320,6 +320,20 @@ public final class DefaultAudioSinkTest {
assertThat(thrown.format).isEqualTo(format); assertThat(thrown.format).isEqualTo(format);
} }
@Test
public void setPlaybackParameters_doesNothingWhenTunnelingIsEnabled() throws Exception {
defaultAudioSink.setAudioSessionId(1);
defaultAudioSink.enableTunnelingV21();
defaultAudioSink.setPlaybackParameters(new PlaybackParameters(2));
configureDefaultAudioSink(/* channelCount= */ 2);
defaultAudioSink.handleBuffer(
createDefaultSilenceBuffer(),
/* presentationTimeUs= */ 5 * C.MICROS_PER_SECOND,
/* encodedAccessUnitCount= */ 1);
assertThat(defaultAudioSink.getPlaybackParameters().speed).isEqualTo(1);
}
private void configureDefaultAudioSink(int channelCount) throws AudioSink.ConfigurationException { private void configureDefaultAudioSink(int channelCount) throws AudioSink.ConfigurationException {
configureDefaultAudioSink(channelCount, /* trimStartFrames= */ 0, /* trimEndFrames= */ 0); configureDefaultAudioSink(channelCount, /* trimStartFrames= */ 0, /* trimEndFrames= */ 0);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册