From b5dae36975662da6b7853724a1cd03470032fca6 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 27 Jul 2024 17:59:29 +0800 Subject: [PATCH] Clean code --- app/build.gradle | 2 -- .../com/fongmi/android/tv/api/Decoder.java | 15 +++++++++++- .../tv/player/exo/NextRenderersFactory.java | 23 ++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8e793f820..ea2e4b908 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,8 +137,6 @@ dependencies { implementation(ext: 'aar', name: 'lib-datasource-okhttp-release', group: 'fongmi', version: 'release') 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/main/java/com/fongmi/android/tv/api/Decoder.java b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java index 08ae18c00..c52c9ac85 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java @@ -20,6 +20,8 @@ import javax.crypto.spec.SecretKeySpec; public class Decoder { + private static final Pattern JS_URI = Pattern.compile("\"(\\.|\\.\\.)/(.?|.+?)\\.js\\?(.?|.+?)\""); + public static String getJson(String url) throws Exception { String key = url.contains(";") ? url.split(";")[2] : ""; url = url.contains(";") ? url.split(";")[0] : url; @@ -33,12 +35,23 @@ public class Decoder { } private static String fix(String url, String data) { - if (url.startsWith("file") || url.startsWith("assets")) url = UrlUtil.convert(url); + url = UrlUtil.convert(url); + Matcher matcher = JS_URI.matcher(data); + while (matcher.find()) data = replace(url, data, matcher.group()); if (data.contains("../")) data = data.replace("../", UrlUtil.resolve(url, "../")); if (data.contains("./")) data = data.replace("./", UrlUtil.resolve(url, "./")); + if (data.contains("__JS1__")) data = data.replace("__JS1__", "./"); + if (data.contains("__JS2__")) data = data.replace("__JS2__", "../"); return data; } + private static String replace(String url, String data, String ext) { + String t = ext.replace("\"./", "\"" + UrlUtil.resolve(url, "./")); + t = t.replace("\"../", "\"" + UrlUtil.resolve(url, "../")); + t = t.replace("./", "__JS1__").replace("../", "__JS2__"); + return data.replace(ext, t); + } + public static String getExt(String ext) { try { return base64(getData(ext.substring(4))); 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 index f0ab74689..c5171c7c3 100644 --- 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 @@ -7,6 +7,8 @@ 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; @@ -14,24 +16,39 @@ 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(); - 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 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 (Players.isHard(decode)) return; + 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);