Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
ed3d1c62
authored
Feb 11, 2021
by
andrewlewis
Committed by
Oliver Woodman
Feb 12, 2021
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Don't set playback parameters when using tunneling
Issue: #4803 PiperOrigin-RevId: 356923345
parent
d0dd33e5
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
12 deletions
RELEASENOTES.md
library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java
library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java
RELEASENOTES.md
View file @
ed3d1c62
...
...
@@ -5,6 +5,9 @@
*
Core library:
*
Fix playback issue for HLS live streams without program date time
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:
*
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).
...
...
library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java
View file @
ed3d1c62
...
...
@@ -488,7 +488,6 @@ public final class DefaultAudioSink implements AudioSink {
throws
ConfigurationException
{
int
inputPcmFrameSize
;
@Nullable
AudioProcessor
[]
availableAudioProcessors
;
boolean
canApplyPlaybackParameters
;
@OutputMode
int
outputMode
;
@C
.
Encoding
int
outputEncoding
;
...
...
@@ -500,11 +499,10 @@ public final class DefaultAudioSink implements AudioSink {
Assertions
.
checkArgument
(
Util
.
isEncodingLinearPcm
(
inputFormat
.
pcmEncoding
));
inputPcmFrameSize
=
Util
.
getPcmFrameSize
(
inputFormat
.
pcmEncoding
,
inputFormat
.
channelCount
);
boolean
useFloatOutput
=
enableFloatOutput
&&
Util
.
isEncodingHighResolutionPcm
(
inputFormat
.
pcmEncoding
);
availableAudioProcessors
=
useFloatOutput
?
toFloatPcmAvailableAudioProcessors
:
toIntPcmAvailableAudioProcessors
;
canApplyPlaybackParameters
=
!
useFloatOutput
;
shouldUseFloatOutput
(
inputFormat
.
pcmEncoding
)
?
toFloatPcmAvailableAudioProcessors
:
toIntPcmAvailableAudioProcessors
;
trimmingAudioProcessor
.
setTrimFrameCount
(
inputFormat
.
encoderDelay
,
inputFormat
.
encoderPadding
);
...
...
@@ -541,7 +539,6 @@ public final class DefaultAudioSink implements AudioSink {
}
else
{
inputPcmFrameSize
=
C
.
LENGTH_UNSET
;
availableAudioProcessors
=
new
AudioProcessor
[
0
];
canApplyPlaybackParameters
=
false
;
outputSampleRate
=
inputFormat
.
sampleRate
;
outputPcmFrameSize
=
C
.
LENGTH_UNSET
;
if
(
enableOffload
&&
isOffloadedPlaybackSupported
(
inputFormat
,
audioAttributes
))
{
...
...
@@ -586,7 +583,6 @@ public final class DefaultAudioSink implements AudioSink {
outputEncoding
,
specifiedBufferSize
,
enableAudioTrackPlaybackParams
,
canApplyPlaybackParameters
,
availableAudioProcessors
);
if
(
isAudioTrackInitialized
())
{
this
.
pendingConfiguration
=
pendingConfiguration
;
...
...
@@ -1336,11 +1332,11 @@ public final class DefaultAudioSink implements AudioSink {
private
void
applyAudioProcessorPlaybackParametersAndSkipSilence
(
long
presentationTimeUs
)
{
PlaybackParameters
playbackParameters
=
configuration
.
canApplyPlaybackParameters
shouldApplyAudioProcessorPlaybackParameters
()
?
audioProcessorChain
.
applyPlaybackParameters
(
getAudioProcessorPlaybackParameters
())
:
PlaybackParameters
.
DEFAULT
;
boolean
skipSilenceEnabled
=
configuration
.
canApplyPlaybackParameters
shouldApplyAudioProcessorPlaybackParameters
()
?
audioProcessorChain
.
applySkipSilenceEnabled
(
getSkipSilenceEnabled
())
:
DEFAULT_SKIP_SILENCE
;
mediaPositionParametersCheckpoints
.
add
(
...
...
@@ -1356,6 +1352,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.
*
* @param positionUs The current audio track position, in microseconds.
...
...
@@ -1897,7 +1918,6 @@ public final class DefaultAudioSink implements AudioSink {
public
final
int
outputChannelConfig
;
@C
.
Encoding
public
final
int
outputEncoding
;
public
final
int
bufferSize
;
public
final
boolean
canApplyPlaybackParameters
;
public
final
AudioProcessor
[]
availableAudioProcessors
;
public
Configuration
(
...
...
@@ -1910,7 +1930,6 @@ public final class DefaultAudioSink implements AudioSink {
int
outputEncoding
,
int
specifiedBufferSize
,
boolean
enableAudioTrackPlaybackParams
,
boolean
canApplyPlaybackParameters
,
AudioProcessor
[]
availableAudioProcessors
)
{
this
.
inputFormat
=
inputFormat
;
this
.
inputPcmFrameSize
=
inputPcmFrameSize
;
...
...
@@ -1919,7 +1938,6 @@ public final class DefaultAudioSink implements AudioSink {
this
.
outputSampleRate
=
outputSampleRate
;
this
.
outputChannelConfig
=
outputChannelConfig
;
this
.
outputEncoding
=
outputEncoding
;
this
.
canApplyPlaybackParameters
=
canApplyPlaybackParameters
;
this
.
availableAudioProcessors
=
availableAudioProcessors
;
// Call computeBufferSize() last as it depends on the other configuration values.
...
...
library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java
View file @
ed3d1c62
...
...
@@ -320,6 +320,20 @@ public final class DefaultAudioSinkTest {
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
{
configureDefaultAudioSink
(
channelCount
,
/* trimStartFrames= */
0
,
/* trimEndFrames= */
0
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment