From 6ccf8319bbd6249134cdb12c63b25103ca4671e1 Mon Sep 17 00:00:00 2001 From: okjack Date: Mon, 15 Jul 2024 18:13:21 +0800 Subject: [PATCH] Support next render --- app/build.gradle | 1 + .../com/fongmi/android/tv/player/Players.java | 4 ++ .../fongmi/android/tv/player/exo/ExoUtil.java | 3 +- .../tv/player/exo/NextRenderersFactory.java | 44 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java diff --git a/app/build.gradle b/app/build.gradle index 52cf3159f..8a9620932 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -112,6 +112,7 @@ dependencies { implementation 'androidx.room:room-runtime:2.6.1' implementation 'androidx.media:media:1.7.0' implementation 'cat.ereza:customactivityoncrash:2.4.0' + implementation('com.github.anilbeesetti.nextlib:nextlib-media3ext:0.7.1') { exclude group: 'androidx.media3', module: 'media3-exoplayer' } implementation 'com.github.bassaer:materialdesigncolors:1.0.0' implementation 'com.github.bumptech.glide:glide:4.16.0' implementation 'com.github.bumptech.glide:annotations:4.16.0' diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 491cd3634..109e65a95 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -98,6 +98,10 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal return type == EXO; } + public static boolean isHard(int decode) { + return decode == HARD; + } + public boolean isHard() { return decode == HARD; } diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java index de3b7f060..ca55a83d8 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java @@ -13,7 +13,6 @@ import androidx.media3.common.PlaybackException; import androidx.media3.common.TrackSelectionOverride; import androidx.media3.common.Tracks; import androidx.media3.exoplayer.DefaultLoadControl; -import androidx.media3.exoplayer.DefaultRenderersFactory; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.LoadControl; import androidx.media3.exoplayer.RenderersFactory; @@ -47,7 +46,7 @@ public class ExoUtil { } public static RenderersFactory buildRenderersFactory(int decode) { - return new DefaultRenderersFactory(App.get()).setEnableDecoderFallback(true).setExtensionRendererMode(decode == Players.SOFT ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON); + return new NextRenderersFactory(App.get(), decode); } public static MediaSource.Factory buildMediaSourceFactory() { diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java b/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java new file mode 100644 index 000000000..f0ab74689 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java @@ -0,0 +1,44 @@ +package com.fongmi.android.tv.player.exo; + +import android.content.Context; +import android.os.Handler; + +import androidx.annotation.NonNull; +import androidx.media3.common.util.Log; +import androidx.media3.exoplayer.DefaultRenderersFactory; +import androidx.media3.exoplayer.Renderer; +import androidx.media3.exoplayer.mediacodec.MediaCodecSelector; +import androidx.media3.exoplayer.video.VideoRendererEventListener; + +import com.fongmi.android.tv.player.Players; + +import java.util.ArrayList; + +import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegVideoRenderer; + +public class NextRenderersFactory extends DefaultRenderersFactory { + + private static final String TAG = NextRenderersFactory.class.getSimpleName(); + private final int decode; + + public NextRenderersFactory(@NonNull Context context, int decode) { + super(context); + this.decode = decode; + setEnableDecoderFallback(true); + setExtensionRendererMode(Players.isHard(decode) ? EXTENSION_RENDERER_MODE_ON : EXTENSION_RENDERER_MODE_PREFER); + } + + @Override + protected void buildVideoRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull Handler eventHandler, @NonNull VideoRendererEventListener eventListener, long allowedVideoJoiningTimeMs, @NonNull ArrayList out) { + super.buildVideoRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, eventHandler, eventListener, allowedVideoJoiningTimeMs, out); + if (Players.isHard(decode)) return; + int extensionRendererIndex = out.size(); + try { + Renderer renderer = new FfmpegVideoRenderer(allowedVideoJoiningTimeMs, eventHandler, eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY); + out.add(extensionRendererIndex++, renderer); + Log.i(TAG, "Loaded FfmpegVideoRenderer."); + } catch (Exception e) { + throw new RuntimeException("Error instantiating Ffmpeg extension", e); + } + } +}