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
f0e734d3
authored
Mar 27, 2020
by
olly
Committed by
Oliver Woodman
Mar 30, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Workaround C2 AAC decoder flush problem on Android 10
Issue: #6671 PiperOrigin-RevId: 303364788
parent
69ca5349
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
0 deletions
RELEASENOTES.md
library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
RELEASENOTES.md
View file @
f0e734d3
...
...
@@ -9,6 +9,8 @@
*
Allow missing hours and milliseconds in SubRip (.srt) timecodes
(
[
#7122
](
https://github.com/google/ExoPlayer/issues/7122
)
).
*
Audio:
*
Workaround issue that could cause slower than realtime playback of AAC on
Android 10 (
[
#6671
](
https://github.com/google/ExoPlayer/issues/6671
)
.
*
Enable playback speed adjustment and silence skipping for floating point PCM
audio, via resampling to 16-bit integer PCM. To output the original floating
point audio without adjustment, pass
`enableFloatOutput=true`
to the
...
...
library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
View file @
f0e734d3
...
...
@@ -344,6 +344,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
private
boolean
codecNeedsReconfigureWorkaround
;
private
boolean
codecNeedsDiscardToSpsWorkaround
;
private
boolean
codecNeedsFlushWorkaround
;
private
boolean
codecNeedsSosFlushWorkaround
;
private
boolean
codecNeedsEosFlushWorkaround
;
private
boolean
codecNeedsEosOutputExceptionWorkaround
;
private
boolean
codecNeedsMonoChannelCountWorkaround
;
...
...
@@ -364,6 +365,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@DrainAction
private
int
codecDrainAction
;
private
boolean
codecReceivedBuffers
;
private
boolean
codecReceivedEos
;
private
boolean
codecHasOutputMediaFormat
;
private
long
largestQueuedPresentationTimeUs
;
private
long
lastBufferInStreamPresentationTimeUs
;
private
boolean
inputStreamEnded
;
...
...
@@ -652,6 +654,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
availableCodecInfos
=
null
;
codecInfo
=
null
;
codecFormat
=
null
;
codecHasOutputMediaFormat
=
false
;
resetInputBuffer
();
resetOutputBuffer
();
resetCodecBuffers
();
...
...
@@ -765,6 +768,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
}
if
(
codecDrainAction
==
DRAIN_ACTION_REINITIALIZE
||
codecNeedsFlushWorkaround
||
(
codecNeedsSosFlushWorkaround
&&
!
codecHasOutputMediaFormat
)
||
(
codecNeedsEosFlushWorkaround
&&
codecReceivedEos
))
{
releaseCodec
();
return
true
;
...
...
@@ -944,6 +948,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
codecNeedsReconfigureWorkaround
=
codecNeedsReconfigureWorkaround
(
codecName
);
codecNeedsDiscardToSpsWorkaround
=
codecNeedsDiscardToSpsWorkaround
(
codecName
,
codecFormat
);
codecNeedsFlushWorkaround
=
codecNeedsFlushWorkaround
(
codecName
);
codecNeedsSosFlushWorkaround
=
codecNeedsSosFlushWorkaround
(
codecName
);
codecNeedsEosFlushWorkaround
=
codecNeedsEosFlushWorkaround
(
codecName
);
codecNeedsEosOutputExceptionWorkaround
=
codecNeedsEosOutputExceptionWorkaround
(
codecName
);
codecNeedsMonoChannelCountWorkaround
=
...
...
@@ -1610,6 +1615,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
/** Processes a new output {@link MediaFormat}. */
private
void
processOutputFormat
()
throws
ExoPlaybackException
{
codecHasOutputMediaFormat
=
true
;
MediaFormat
mediaFormat
=
codec
.
getOutputFormat
();
if
(
codecAdaptationWorkaroundMode
!=
ADAPTATION_WORKAROUND_MODE_NEVER
&&
mediaFormat
.
getInteger
(
MediaFormat
.
KEY_WIDTH
)
==
ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT
...
...
@@ -1989,4 +1995,20 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
&&
"OMX.MTK.AUDIO.DECODER.MP3"
.
equals
(
name
);
}
/**
* Returns whether the decoder is known to behave incorrectly if flushed prior to having output a
* {@link MediaFormat}.
*
* <p>If true is returned, the renderer will work around the issue by instantiating a new decoder
* when this case occurs.
*
* <p>See [Internal: b/141097367].
*
* @param name The name of the decoder.
* @return True if the decoder is known to behave incorrectly if flushed prior to having output a
* {@link MediaFormat}. False otherwise.
*/
private
static
boolean
codecNeedsSosFlushWorkaround
(
String
name
)
{
return
Util
.
SDK_INT
==
29
&&
"c2.android.aac.decoder"
.
equals
(
name
);
}
}
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