refactor: use spi to get codec instance.

This commit is contained in:
oxy-macmini
2025-03-10 00:31:24 +08:00
parent 7006035c9e
commit 4396518a2e
11 changed files with 84 additions and 6 deletions

View File

@ -33,6 +33,7 @@ dependencies {
.startParameter
.taskNames
.find { it.contains("richCodec", ignoreCase = true) } != null
implementation(project(":data:codec"))
if (richCodec) {
implementation(project(":data:codec:rich"))
} else {

View File

@ -0,0 +1,23 @@
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.com.google.devtools.ksp)
}
android {
namespace = "com.m3u.data.codec"
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.auto.service.annotations)
ksp(libs.auto.service.ksp)
}

View File

View File

@ -1,6 +1,7 @@
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.com.google.devtools.ksp)
}
android {
@ -11,8 +12,14 @@ android {
}
dependencies {
implementation(project(":data:codec"))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.auto.service.annotations)
ksp(libs.auto.service.ksp)
}

View File

@ -3,9 +3,11 @@ package com.m3u.data.codec
import android.content.Context
import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.RenderersFactory
import com.google.auto.service.AutoService
object Codecs {
fun createRenderersFactory(context: Context): RenderersFactory {
@AutoService(Codecs::class)
class LiteCodecs: Codecs {
override fun createRenderersFactory(context: Context): RenderersFactory {
return DefaultRenderersFactory(context).apply {
setEnableDecoderFallback(true)
}

21
data/codec/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -1,6 +1,7 @@
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.com.google.devtools.ksp)
}
android {
@ -11,9 +12,15 @@ android {
}
dependencies {
implementation(project(":data:codec"))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.media3.exoplayer)
implementation(libs.nextlib.media3.ext)
implementation(libs.auto.service.annotations)
ksp(libs.auto.service.ksp)
}

View File

@ -3,10 +3,12 @@ package com.m3u.data.codec
import android.content.Context
import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.RenderersFactory
import com.google.auto.service.AutoService
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.NextRenderersFactory
object Codecs {
fun createRenderersFactory(context: Context): RenderersFactory {
@AutoService(Codecs::class)
class RichCodec: Codecs {
override fun createRenderersFactory(context: Context): RenderersFactory {
return NextRenderersFactory(context).apply {
setEnableDecoderFallback(true)
setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)

View File

@ -0,0 +1,15 @@
package com.m3u.data.codec
import android.content.Context
import androidx.media3.exoplayer.RenderersFactory
import java.util.ServiceLoader
interface Codecs {
fun createRenderersFactory(context: Context): RenderersFactory
companion object {
fun load(): Codecs {
return ServiceLoader.load(Codecs::class.java).first()
}
}
}

View File

@ -369,7 +369,7 @@ class PlayerManagerImpl @Inject constructor(
}
private val renderersFactory: RenderersFactory by lazy {
Codecs.createRenderersFactory(context)
Codecs.load().createRenderersFactory(context)
}
private fun createTrackSelector(tunneling: Boolean): TrackSelector {

View File

@ -18,7 +18,7 @@ rootProject.name = "M3U"
include(":app:smartphone", ":app:tv")
include(":core")
include(":data")
include(":data:codec:lite", ":data:codec:rich")
include(":data:codec", ":data:codec:lite", ":data:codec:rich")
include(
":business:foryou",
":business:favorite",