|
|
|
|
@ -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<Renderer> 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<Renderer> 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); |
|
|
|
|
|