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 be null.
  • com.google.android.exoplayer2.mediacodec.* and com.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 for MediaCodecAdapter, used to instantiate MediaCodec.
  • mediaCodecSelector: selects which MediaCodec to use.
  • allowedJoiningTimeMs: the time allowed for codec switching without visible interruption.
  • enableDecoderFallback: if true, allows using an alternative codec in case of failure.
  • eventHandler and eventListener: 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 in codecNeedsSetOutputSurfaceWorkaround.

📌 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 être null.
  • com.google.android.exoplayer2.mediacodec.* et com.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 de MediaCodecAdapter, utilisé pour instancier MediaCodec.
  • mediaCodecSelector : sélectionne quel MediaCodec utiliser.
  • allowedJoiningTimeMs : temps accordé pour le changement de codec sans interruption visible.
  • enableDecoderFallback : si true, permet d’utiliser un autre codec en cas d’échec.
  • eventHandler et eventListener : 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 dans codecNeedsSetOutputSurfaceWorkaround.

📌 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.