-
Notifications
You must be signed in to change notification settings - Fork 518
After 1.5.0, Android 15 may experience screen flickering #2059
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Is this only happening on the emulator? And if so, does it happen for all videos? I tried to use the same emulator, but don't see anything suspicious when playing one of the videos in the demo app. |
Because I don't currently have a real Android 15 device, I only found this issue on the Android 15 emulator. The problem occurs in all videos, mainly related to the timing of starting playback and the surface settings, It can reproduce in Index: demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java b/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java
--- a/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java (revision 76088cd6af7f263aba238b7a48d64bd4f060cb8b)
+++ b/demos/main/src/main/java/androidx/media3/demo/main/PlayerActivity.java (date 1737381685094)
@@ -19,6 +19,7 @@
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.util.Pair;
import android.view.KeyEvent;
import android.view.View;
@@ -279,7 +280,7 @@
player.addAnalyticsListener(new EventLogger());
player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true);
player.setPlayWhenReady(startAutoPlay);
- playerView.setPlayer(player);
+
configurePlayerWithServerSideAdsLoader();
debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start();
@@ -294,6 +295,12 @@
if (repeatModeExtra != null) {
player.setRepeatMode(IntentUtil.parseRepeatModeExtra(repeatModeExtra));
}
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ playerView.setPlayer(player);
+ }
+ }, 5000);
updateButtonVisibility();
return true;
} It mainly occurs on Android 15. After the 1.5.0 version of the media player starts playing, set the surface to the player, such as playerView.setPlayer (player), then screen flickering In Android 15, this issue does not occur in versions 1.4.0 and below . Comparison of videos in different scenariosRight:studio_video_1737784878273712.MOVError:studio_video_1737784878273712.2.MOV |
Thanks, I can reproduce this as well now (didn't realize the delayed attachment of PlayerView is relevant). This looks like a clear emulator bug (playback works fine on a real device). I've reported it to the emulator team internally (ref b/392540687). |
Observing very similar issue with flickering with Investigation showed:
Question |
Sounds like it could be related given the setup steps with the delayed surface setting. If you can reproduce locally on the mentioned devices, could you try overriding |
Yes, I tried it yesterday and it looks like the reason, as I can no longer reproduce the issue. (I've now tested this on the mentioned emulator — without the fix, the issue appears consistently, and with the fix applied, the issue is resolved. However, I still need to verify these results on mentioned physical devices, it looks like decoders related). Thanks! Here is the code for reference — please let me know if you have any suggestions! class CustomRendersFactory(
context: Context,
) : DefaultRenderersFactory(context) {
override fun buildVideoRenderers(
context: Context,
extensionRendererMode: Int,
mediaCodecSelector: MediaCodecSelector,
enableDecoderFallback: Boolean,
eventHandler: Handler,
eventListener: VideoRendererEventListener,
allowedVideoJoiningTimeMs: Long,
out: ArrayList<Renderer>,
) {
super.buildVideoRenderers(
/* context = */ context,
/* extensionRendererMode = */ extensionRendererMode,
/* mediaCodecSelector = */ mediaCodecSelector,
/* enableDecoderFallback = */ enableDecoderFallback,
/* eventHandler = */ eventHandler,
/* eventListener = */ eventListener,
/* allowedVideoJoiningTimeMs = */ allowedVideoJoiningTimeMs,
/* out = */ out,
)
runCatching {
synchronized(this) {
val index = out.indexOfFirst { it is MediaCodecVideoRenderer }
if (index != -1) {
out[index] = CustomMediaCodecVideoRenderer(
/* context = */ context,
/* mediaCodecSelector = */ mediaCodecSelector,
/* allowedJoiningTimeMs = */ allowedVideoJoiningTimeMs,
/* eventHandler = */ eventHandler,
/* eventListener = */ eventListener,
/* maxDroppedFramesToNotify = */ 50,
internalFeatures = internalFeatures,
)
}
}
}
}
}
class CustomMediaCodecVideoRenderer(
context: Context,
mediaCodecSelector: MediaCodecSelector,
allowedJoiningTimeMs: Long,
eventHandler: Handler,
eventListener: VideoRendererEventListener,
maxDroppedFramesToNotify: Int,
) : MediaCodecVideoRenderer(
context,
mediaCodecSelector,
allowedJoiningTimeMs,
eventHandler,
eventListener,
maxDroppedFramesToNotify,
) {
override fun shouldUseDetachedSurface(codecInfo: MediaCodecInfo): Boolean {
// I've returned `false` when I was testing it on emulator.
if (Util.SDK_INT >= 35 && deviceExcludedFromDetachedSurface()) {
return false
}
return super.shouldUseDetachedSurface(codecInfo)
}
private fun deviceExcludedFromDetachedSurface(): Boolean {
return Build.MANUFACTURER in EXCLUDED_DEVICES_NAME
}
private companion object {
val EXCLUDED_DEVICES_NAME = setOf(
"Xiaomi",
"OPPO",
)
}
} |
Thanks for the confirmation! We probably need to add a similar exclusion mechanism as in your comment above. When you say it "looks like decoder related" - do you mean it only reproduces with specific decoders? If so, could you share which codec name is affected exactly on the physical devices? Ideally, it would be great if you share a bugreport from such a device as well so we can forward this to the codec team for further investigation (you can send it to [email protected] with "Issue #2059" in the subject) |
We'll exclude Xiaomi and OPPO devices from the new feature with the 1.6.0-rc02 release so that you don't need to add a manual workaround. If you do have more details on the involved codecs, we may be able to provide a more targeted workaround in the future. We also filed an internal bug with the codec team to investigate further (internal ref b/402701573) and see if there is a way to avoid this problematic behavior by additional platform tests. |
Ideally, we'd find a more targeted exclusion as it may depend on specific codecs. The current workaround should help with the reported issues that are limited to Xiaomi and OPPO. Issue: #2059 #cherrypick PiperOrigin-RevId: 738017969
@tonihei Great. Thank you so much. Sorry for late follow up from my end. Adding more details
All Android 15.
Since the problems appear visually different, I suspected they may be decoder-related. Both (Dash & Mp4) playbacks were affected. Also, we fall back to software decoders when hardware decoding is unavailable. Thanks again, and please let me know if you need more details. |
@tonihei hi, can confirm that we also noticed it on Thanks! |
Version
Media3 1.5.0
More version details
>= 1.5.0
Devices that reproduce the issue
Android 15 emulated device
Devices that do not reproduce the issue
Android OS Version < 15
Reproducible in the demo app?
Yes
Reproduction steps
demos/main :
Delaying
playerView.setPlayer(player);
until video is successfully prepared, screen flickeringIt works well in version 1.4.x , but after upgrading to 1.5.x, this scenario does not work properly on the Android 15 emulator
Expected result
Work normally like version 1.4.x
Actual result
On Android 15, 1.5.x version, the screen will flicker
Media
When the problem is triggered in the demo
2025-01-20.22.06.37.mov
Bug Report
adb bugreport
to [email protected] after filing this issue.The text was updated successfully, but these errors were encountered: