This code defines a Java class CustomMediaCodecVideoRenderer
, which is a subclass of MediaCodecVideoRenderer
from ExoPlayer. This class is used to work around a specific issue on certain Android devices related to the handling of the video rendering surface (setOutputSurface
).
🔹 Detailed Code Explanation
📌 Package and Imports
The file is in the package org.schabi.newpipe.player.helper
, which suggests it belongs to a project related to NewPipe, an open-source video player application.
The imports include:
android.content.Context
: provides the application context.android.os.Handler
: used to manage the execution of asynchronous tasks.androidx.annotation.Nullable
: annotation to indicate that a parameter can benull
.com.google.android.exoplayer2.mediacodec.*
andcom.google.android.exoplayer2.video.*
: ExoPlayer classes, a media playback library for Android.
🔹 Class Description
📌 Class CustomMediaCodecVideoRenderer
It inherits from MediaCodecVideoRenderer
, an ExoPlayer class that handles video rendering via MediaCodec
, the Android API for hardware decoding.
📌 Why is this class necessary?
Some Android devices have a bug related to MediaCodec.setOutputSurface(Surface)
, which causes video display issues.
ExoPlayer includes a function codecNeedsSetOutputSurfaceWorkaround(String name)
to identify affected devices and apply a workaround.
However, this list is not exhaustive. CustomMediaCodecVideoRenderer
therefore always forces the workaround, even if the device is not on ExoPlayer's list.
🔹 Implementation Details
📌 Constructor
public CustomMediaCodecVideoRenderer(final Context context,
final MediaCodecAdapter.Factory codecAdapterFactory,
final MediaCodecSelector mediaCodecSelector,
final long allowedJoiningTimeMs,
final boolean enableDecoderFallback,
@Nullable final Handler eventHandler,
@Nullable final VideoRendererEventListener eventListener,
final int maxDroppedFramesToNotify) {
super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs,
enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify);
}
This constructor calls the one in MediaCodecVideoRenderer
and passes all parameters without modification.
context
: the Android context.codecAdapterFactory
: a factory forMediaCodecAdapter
, used to instantiateMediaCodec
.mediaCodecSelector
: selects whichMediaCodec
to use.allowedJoiningTimeMs
: the time allowed for codec switching without visible interruption.enableDecoderFallback
: iftrue
, allows using an alternative codec in case of failure.eventHandler
andeventListener
: used to send events to the user interface.maxDroppedFramesToNotify
: the maximum number of dropped frames before sending a warning.
📌 Method codecNeedsSetOutputSurfaceWorkaround
@Override
protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) {
return true;
}
In the parent class MediaCodecVideoRenderer
, this method checks if a workaround is needed based on the device name.
Here, the method is overridden to always return true
, forcing the workaround to be applied.
🔹 Summary
📌 Objective: Fix an issue on certain Android devices where MediaCodec.setOutputSurface(Surface)
does not work properly.
📌 How?
- Inherits from
MediaCodecVideoRenderer
in ExoPlayer. - Forces the workaround by always returning
true
incodecNeedsSetOutputSurfaceWorkaround
.
📌 Impact:
- Prevents video display bugs on devices not listed by ExoPlayer.
- Affects only Android 6.0+, as
setOutputSurface
did not exist before.
Ce code définit une classe Java CustomMediaCodecVideoRenderer
, qui est une sous-classe de MediaCodecVideoRenderer
d'ExoPlayer. Cette classe est utilisée pour contourner un problème spécifique à certains appareils Android liés à la gestion de la surface de rendu vidéo (setOutputSurface
).
🔹 Explication détaillée du code
📌 Package et imports
Le fichier est dans le package org.schabi.newpipe.player.helper
, ce qui suggère qu'il appartient à un projet lié à NewPipe, une application open-source de lecture de vidéos.
Les imports incluent :
android.content.Context
: fournit le contexte de l'application.android.os.Handler
: utilisé pour gérer l'exécution des tâches asynchrones.androidx.annotation.Nullable
: annotation pour indiquer qu'un paramètre peut êtrenull
.com.google.android.exoplayer2.mediacodec.*
etcom.google.android.exoplayer2.video.*
: classes d'ExoPlayer, une bibliothèque de lecture multimédia pour Android.
🔹 Description de la classe
📌 Classe CustomMediaCodecVideoRenderer
Elle hérite de MediaCodecVideoRenderer
, une classe d'ExoPlayer qui gère le rendu vidéo via MediaCodec
, l'API Android permettant le décodage matériel.
📌 Pourquoi cette classe est-elle nécessaire ?
Certains appareils Android ont un bug lié à MediaCodec.setOutputSurface(Surface)
, qui cause des problèmes d'affichage vidéo.
ExoPlayer inclut une fonction codecNeedsSetOutputSurfaceWorkaround(String name)
pour identifier les appareils affectés et appliquer un correctif.
Cependant, cette liste n'est pas exhaustive. CustomMediaCodecVideoRenderer
force donc toujours l'utilisation du correctif, même si l'appareil n'est pas dans la liste d'ExoPlayer.
🔹 Détails de l'implémentation
📌 Constructeur
public CustomMediaCodecVideoRenderer(final Context context,
final MediaCodecAdapter.Factory codecAdapterFactory,
final MediaCodecSelector mediaCodecSelector,
final long allowedJoiningTimeMs,
final boolean enableDecoderFallback,
@Nullable final Handler eventHandler,
@Nullable final VideoRendererEventListener eventListener,
final int maxDroppedFramesToNotify) {
super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs,
enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify);
}
Ce constructeur appelle celui de MediaCodecVideoRenderer
et transmet tous les paramètres sans modification.
context
: le contexte Android.codecAdapterFactory
: fabrique deMediaCodecAdapter
, utilisé pour instancierMediaCodec
.mediaCodecSelector
: sélectionne quelMediaCodec
utiliser.allowedJoiningTimeMs
: temps accordé pour le changement de codec sans interruption visible.enableDecoderFallback
: sitrue
, permet d’utiliser un autre codec en cas d’échec.eventHandler
eteventListener
: permettent d'envoyer des événements à l'interface utilisateur.maxDroppedFramesToNotify
: nombre maximal d'images perdues avant d'envoyer un avertissement.
📌 Méthode codecNeedsSetOutputSurfaceWorkaround
@Override
protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) {
return true;
}
Dans la classe mère MediaCodecVideoRenderer
, cette méthode vérifie si un correctif est nécessaire en fonction du nom de l'appareil.
Ici, la méthode est redéfinie pour toujours retourner true
, forçant l'activation du correctif.
🔹 Résumé
📌 Objectif : Corriger un problème sur certains appareils Android où MediaCodec.setOutputSurface(Surface)
ne fonctionne pas correctement.
📌 Comment ?
- Hérite de
MediaCodecVideoRenderer
d'ExoPlayer. - Force l’application du correctif en retournant toujours
true
danscodecNeedsSetOutputSurfaceWorkaround
.
📌 Impact :
- Permet d'éviter des bugs d'affichage vidéo sur des appareils non listés par ExoPlayer.
- Affecte uniquement Android 6.0+, car
setOutputSurface
n'existait pas avant.