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
c728de99
authored
Jun 10, 2021
by
olly
Committed by
Oliver Woodman
Jun 10, 2021
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Fix IncorrectContextUseViolation on Android 11
Issue: #8246 PiperOrigin-RevId: 378606475
parent
358f400b
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
102 additions
and
45 deletions
RELEASENOTES.md
library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java
RELEASENOTES.md
View file @
c728de99
...
...
@@ -55,6 +55,8 @@
swapping the output
`Surface`
and a mixture of secure and non-secure
content being played
(
[
#8776
](
https://github.com/google/ExoPlayer/issues/8776
)
).
*
Fix
`IncorrectContextUseViolation`
strict mode warning on Android 11
(
[
#8246
](
https://github.com/google/ExoPlayer/pull/8246
)
).
*
Ad playback:
*
Support changing ad break positions in the player logic
(
[
#5067
](
https://github.com/google/ExoPlayer/issues/5067
)
.
...
...
library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseHelper.java
View file @
c728de99
...
...
@@ -17,7 +17,6 @@ package com.google.android.exoplayer2.video;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Assertions
.
checkNotNull
;
import
android.annotation.TargetApi
;
import
android.content.Context
;
import
android.hardware.display.DisplayManager
;
import
android.os.Handler
;
...
...
@@ -91,9 +90,8 @@ public final class VideoFrameReleaseHelper {
private
static
final
long
VSYNC_OFFSET_PERCENTAGE
=
80
;
private
final
FixedFrameRateEstimator
frameRateEstimator
;
@Nullable
private
final
WindowManager
windowManag
er
;
@Nullable
private
final
DisplayHelper
displayHelp
er
;
@Nullable
private
final
VSyncSampler
vsyncSampler
;
@Nullable
private
final
DefaultDisplayListener
displayListener
;
private
boolean
started
;
@Nullable
private
Surface
surface
;
...
...
@@ -127,20 +125,8 @@ public final class VideoFrameReleaseHelper {
*/
public
VideoFrameReleaseHelper
(
@Nullable
Context
context
)
{
frameRateEstimator
=
new
FixedFrameRateEstimator
();
if
(
context
!=
null
)
{
context
=
context
.
getApplicationContext
();
windowManager
=
(
WindowManager
)
context
.
getSystemService
(
Context
.
WINDOW_SERVICE
);
}
else
{
windowManager
=
null
;
}
if
(
windowManager
!=
null
)
{
displayListener
=
Util
.
SDK_INT
>=
17
?
maybeBuildDefaultDisplayListenerV17
(
checkNotNull
(
context
))
:
null
;
vsyncSampler
=
VSyncSampler
.
getInstance
();
}
else
{
displayListener
=
null
;
vsyncSampler
=
null
;
}
displayHelper
=
maybeBuildDisplayHelper
(
context
);
vsyncSampler
=
displayHelper
!=
null
?
VSyncSampler
.
getInstance
()
:
null
;
vsyncDurationNs
=
C
.
TIME_UNSET
;
vsyncOffsetNs
=
C
.
TIME_UNSET
;
formatFrameRate
=
Format
.
NO_VALUE
;
...
...
@@ -148,14 +134,10 @@ public final class VideoFrameReleaseHelper {
}
/** Called when the renderer is enabled. */
@TargetApi
(
17
)
// displayListener is null if Util.SDK_INT < 17.
public
void
onEnabled
()
{
if
(
windowManag
er
!=
null
)
{
if
(
displayHelp
er
!=
null
)
{
checkNotNull
(
vsyncSampler
).
addObserver
();
if
(
displayListener
!=
null
)
{
displayListener
.
register
();
}
updateDefaultDisplayRefreshRateParams
();
displayHelper
.
register
(
this
::
updateDefaultDisplayRefreshRateParams
);
}
}
...
...
@@ -233,12 +215,9 @@ public final class VideoFrameReleaseHelper {
}
/** Called when the renderer is disabled. */
@TargetApi
(
17
)
// displayListener is null if Util.SDK_INT < 17.
public
void
onDisabled
()
{
if
(
windowManager
!=
null
)
{
if
(
displayListener
!=
null
)
{
displayListener
.
unregister
();
}
if
(
displayHelper
!=
null
)
{
displayHelper
.
unregister
();
checkNotNull
(
vsyncSampler
).
removeObserver
();
}
}
...
...
@@ -394,15 +373,7 @@ public final class VideoFrameReleaseHelper {
// Display refresh rate and vsync logic.
@RequiresApi
(
17
)
@Nullable
private
DefaultDisplayListener
maybeBuildDefaultDisplayListenerV17
(
Context
context
)
{
DisplayManager
manager
=
(
DisplayManager
)
context
.
getSystemService
(
Context
.
DISPLAY_SERVICE
);
return
manager
==
null
?
null
:
new
DefaultDisplayListener
(
manager
);
}
private
void
updateDefaultDisplayRefreshRateParams
()
{
Display
defaultDisplay
=
checkNotNull
(
windowManager
).
getDefaultDisplay
();
private
void
updateDefaultDisplayRefreshRateParams
(
@Nullable
Display
defaultDisplay
)
{
if
(
defaultDisplay
!=
null
)
{
double
defaultDisplayRefreshRate
=
defaultDisplay
.
getRefreshRate
();
vsyncDurationNs
=
(
long
)
(
C
.
NANOS_PER_SECOND
/
defaultDisplayRefreshRate
);
...
...
@@ -431,21 +402,108 @@ public final class VideoFrameReleaseHelper {
return
snappedAfterDiff
<
snappedBeforeDiff
?
snappedAfterNs
:
snappedBeforeNs
;
}
@Nullable
private
static
DisplayHelper
maybeBuildDisplayHelper
(
@Nullable
Context
context
)
{
@Nullable
DisplayHelper
displayHelper
=
null
;
if
(
context
!=
null
)
{
context
=
context
.
getApplicationContext
();
if
(
Util
.
SDK_INT
>=
17
)
{
displayHelper
=
DisplayHelperV17
.
maybeBuildNewInstance
(
context
);
}
if
(
displayHelper
==
null
)
{
displayHelper
=
DisplayHelperV16
.
maybeBuildNewInstance
(
context
);
}
}
return
displayHelper
;
}
/** Helper for listening to changes to the default display. */
private
interface
DisplayHelper
{
/** Listener for changes to the default display. */
interface
Listener
{
/**
* Called when the default display changes.
*
* @param defaultDisplay The default display, or {@code null} if a corresponding {@link
* Display} object could not be obtained.
*/
void
onDefaultDisplayChanged
(
@Nullable
Display
defaultDisplay
);
}
/**
* Enables the helper, invoking {@link Listener#onDefaultDisplayChanged(Display)} to pass the
* initial default display.
*/
void
register
(
Listener
listener
);
/** Disables the helper. */
void
unregister
();
}
private
static
final
class
DisplayHelperV16
implements
DisplayHelper
{
@Nullable
public
static
DisplayHelper
maybeBuildNewInstance
(
Context
context
)
{
WindowManager
windowManager
=
(
WindowManager
)
context
.
getSystemService
(
Context
.
WINDOW_SERVICE
);
return
windowManager
!=
null
?
new
DisplayHelperV16
(
windowManager
)
:
null
;
}
private
final
WindowManager
windowManager
;
private
DisplayHelperV16
(
WindowManager
windowManager
)
{
this
.
windowManager
=
windowManager
;
}
@Override
public
void
register
(
Listener
listener
)
{
listener
.
onDefaultDisplayChanged
(
windowManager
.
getDefaultDisplay
());
}
@Override
public
void
unregister
()
{
// Do nothing.
}
}
@RequiresApi
(
17
)
private
final
class
DefaultDisplayListener
implements
DisplayManager
.
DisplayListener
{
private
static
final
class
DisplayHelperV17
implements
DisplayHelper
,
DisplayManager
.
DisplayListener
{
@Nullable
public
static
DisplayHelper
maybeBuildNewInstance
(
Context
context
)
{
DisplayManager
displayManager
=
(
DisplayManager
)
context
.
getSystemService
(
Context
.
DISPLAY_SERVICE
);
return
displayManager
!=
null
?
new
DisplayHelperV17
(
displayManager
)
:
null
;
}
private
final
DisplayManager
displayManager
;
@Nullable
private
Listener
listener
;
p
ublic
DefaultDisplayListener
(
DisplayManager
displayManager
)
{
p
rivate
DisplayHelperV17
(
DisplayManager
displayManager
)
{
this
.
displayManager
=
displayManager
;
}
public
void
register
()
{
@Override
public
void
register
(
Listener
listener
)
{
this
.
listener
=
listener
;
displayManager
.
registerDisplayListener
(
this
,
Util
.
createHandlerForCurrentLooper
());
listener
.
onDefaultDisplayChanged
(
getDefaultDisplay
());
}
@Override
public
void
unregister
()
{
displayManager
.
unregisterDisplayListener
(
this
);
listener
=
null
;
}
@Override
public
void
onDisplayChanged
(
int
displayId
)
{
if
(
listener
!=
null
&&
displayId
==
Display
.
DEFAULT_DISPLAY
)
{
listener
.
onDefaultDisplayChanged
(
getDefaultDisplay
());
}
}
@Override
...
...
@@ -458,11 +516,8 @@ public final class VideoFrameReleaseHelper {
// Do nothing.
}
@Override
public
void
onDisplayChanged
(
int
displayId
)
{
if
(
displayId
==
Display
.
DEFAULT_DISPLAY
)
{
updateDefaultDisplayRefreshRateParams
();
}
private
Display
getDefaultDisplay
()
{
return
displayManager
.
getDisplay
(
Display
.
DEFAULT_DISPLAY
);
}
}
...
...
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