diff --git a/app/build.gradle b/app/build.gradle index e7cc76394..bdbc38590 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,7 +98,6 @@ dependencies { implementation 'androidx.media:media:1.7.0' implementation 'androidx.room:room-runtime:2.6.1' implementation 'cat.ereza:customactivityoncrash:2.4.0' - implementation('com.github.anilbeesetti.nextlib:nextlib-media3ext:0.8.2') { 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' @@ -138,6 +137,7 @@ dependencies { implementation(ext: 'aar', name: 'lib-datasource-rtmp-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-decoder-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-decoder-av1-release', group: 'fongmi', version: 'release') + implementation(ext: 'aar', name: 'lib-decoder-ffmpeg-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-exoplayer-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-exoplayer-dash-release', group: 'fongmi', version: 'release') implementation(ext: 'aar', name: 'lib-exoplayer-hls-release', group: 'fongmi', version: 'release') diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index 8adfd368e..89efd6fa3 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -195,7 +195,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List } private void onDecode() { - mPlayers.toggleDecode(mBinding.exo); + mPlayers.toggleDecode(); setDecode(); onReset(); } @@ -347,7 +347,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List private void onCheck(ErrorEvent event) { if (event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); - else mPlayers.toggleDecode(mBinding.exo); + else mPlayers.toggleDecode(); mPlayers.setMediaItem(); setDecode(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index bdc0bc421..46c8411f8 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -385,7 +385,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void onDecode() { - mPlayers.toggleDecode(mBinding.exo); + mPlayers.toggleDecode(); setDecode(); fetch(); } @@ -749,7 +749,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void onCheck(ErrorEvent event) { if (event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); - else mPlayers.toggleDecode(mBinding.exo); + else mPlayers.toggleDecode(); mPlayers.setMediaItem(); setDecode(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 8d37b4556..2761dad0b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -843,7 +843,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void onDecode() { - mPlayers.toggleDecode(mBinding.exo); + mPlayers.toggleDecode(); setDecode(); onRefresh(); } @@ -1143,7 +1143,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void onCheck(ErrorEvent event) { if (event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); - else mPlayers.toggleDecode(mBinding.exo); + else mPlayers.toggleDecode(); mPlayers.setMediaItem(); setDecode(); } 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 8e000d87e..31797b7d0 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 @@ -277,9 +277,8 @@ public class Players implements Player.Listener, ParseCallback { return setSpeed(speed); } - public void toggleDecode(PlayerView exo) { + public void toggleDecode() { Setting.putDecode(decode = isHard() ? SOFT : HARD); - init(exo); } public String getPositionTime(long time) { 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 b6c115ccf..552f084e0 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 @@ -1,5 +1,8 @@ package com.fongmi.android.tv.player.exo; +import static androidx.media3.exoplayer.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON; +import static androidx.media3.exoplayer.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER; + import android.content.Context; import android.graphics.Color; import android.net.Uri; @@ -14,6 +17,7 @@ import androidx.media3.common.TrackSelectionOverride; import androidx.media3.common.Tracks; import androidx.media3.common.util.Util; 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; @@ -52,7 +56,7 @@ public class ExoUtil { } public static RenderersFactory buildRenderersFactory(int decode) { - return new NextRenderersFactory(App.get(), decode); + return new DefaultRenderersFactory(App.get()).setEnableDecoderFallback(true).setExtensionRendererMode(Players.isHard(decode) ? EXTENSION_RENDERER_MODE_ON : EXTENSION_RENDERER_MODE_PREFER); } 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 deleted file mode 100644 index c5171c7c3..000000000 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/NextRenderersFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -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.audio.AudioRendererEventListener; -import androidx.media3.exoplayer.audio.AudioSink; -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.FfmpegAudioRenderer; -import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.FfmpegVideoRenderer; - -public class NextRenderersFactory extends DefaultRenderersFactory { - - private static final String TAG = NextRenderersFactory.class.getSimpleName(); - - public NextRenderersFactory(@NonNull Context context, int decode) { - super(context); - setEnableDecoderFallback(true); - setExtensionRendererMode(Players.isHard(decode) ? EXTENSION_RENDERER_MODE_ON : EXTENSION_RENDERER_MODE_PREFER); - } - - @Override - protected void buildAudioRenderers(@NonNull Context context, int extensionRendererMode, @NonNull MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, @NonNull AudioSink audioSink, @NonNull Handler eventHandler, @NonNull AudioRendererEventListener eventListener, @NonNull ArrayList out) { - super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out); - int extensionRendererIndex = out.size(); - if (extensionRendererMode == EXTENSION_RENDERER_MODE_PREFER) { - extensionRendererIndex--; - } - try { - Renderer renderer = new FfmpegAudioRenderer(eventHandler, eventListener, audioSink); - out.add(extensionRendererIndex++, renderer); - Log.i(TAG, "Loaded FfmpegAudioRenderer."); - } catch (Exception e) { - throw new RuntimeException("Error instantiating Ffmpeg extension", e); - } - } - - @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 (extensionRendererMode == EXTENSION_RENDERER_MODE_ON) 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); - } - } -} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index ecb8b2c7d..92a5399d6 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -416,7 +416,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List } private void onDecode() { - mPlayers.toggleDecode(mBinding.exo); + mPlayers.toggleDecode(); setR1Callback(); setDecode(); fetch(); @@ -808,7 +808,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List private void onCheck(ErrorEvent event) { if (event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); - else mPlayers.toggleDecode(mBinding.exo); + else mPlayers.toggleDecode(); mPlayers.setMediaItem(); setDecode(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index d02dc01eb..e9372fe19 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -773,7 +773,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void onDecode() { - mPlayers.toggleDecode(mBinding.exo); + mPlayers.toggleDecode(); setR1Callback(); setDecode(); onRefresh(); @@ -1163,7 +1163,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void onCheck(ErrorEvent event) { if (event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); - else mPlayers.toggleDecode(mBinding.exo); + else mPlayers.toggleDecode(); mPlayers.setMediaItem(); setDecode(); }