Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ class LaunchTestSourceContentModeTest {
rawPreset = "punchy",
)

assertEquals(PlaybackRenderBackend.EXPERIMENTAL_GL, overrides.backend)
assertEquals(PlaybackRenderBackend.STANDARD_EXO, overrides.backend)
assertEquals(VideoRenderRuleKey.HDR10_PLUS, overrides.ruleKey)
assertEquals(ToneMappingProfilePreset.PUNCHY, overrides.preset)
}
Expand Down Expand Up @@ -461,7 +461,7 @@ class LaunchTestSourceContentModeTest {
hasBaseUrlExtra = false,
),
playbackOverrides = LaunchPlaybackOverrides(
backend = PlaybackRenderBackend.EXPERIMENTAL_GL,
backend = PlaybackRenderBackend.STANDARD_EXO,
ruleKey = null,
preset = null,
),
Expand Down Expand Up @@ -513,7 +513,7 @@ class LaunchTestSourceContentModeTest {
hasBaseUrlExtra = false,
),
playbackOverrides = LaunchPlaybackOverrides(
backend = PlaybackRenderBackend.EXPERIMENTAL_GL,
backend = PlaybackRenderBackend.STANDARD_EXO,
ruleKey = null,
preset = null,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ fun pictureSessionOverrideLabel(): String =
fun playbackBackendLabel(backend: PlaybackRenderBackend): String =
when (backend.normalizeSupportedBackend()) {
PlaybackRenderBackend.STANDARD_EXO -> "标准 Exo"
PlaybackRenderBackend.EXPERIMENTAL_GL -> "旧实验 GL"
PlaybackRenderBackend.EXPERIMENTAL_GL -> "标准 Exo"
PlaybackRenderBackend.EXPERIMENTAL_MPV_ANDROID -> "实验 mpv 内嵌"
PlaybackRenderBackend.EXPERIMENTAL_MPV_EMBEDDED -> "实验 mpv 内嵌"
PlaybackRenderBackend.EXPERIMENTAL_IJKPLAYER -> "实验 ijkplayer"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable
@Serializable
enum class PlaybackRenderBackend {
STANDARD_EXO,
// Serialized migration token only; normalizeSupportedBackend maps it to STANDARD_EXO.
EXPERIMENTAL_GL,
EXPERIMENTAL_MPV_ANDROID,
EXPERIMENTAL_MPV_EMBEDDED,
Expand All @@ -15,7 +16,7 @@ enum class PlaybackRenderBackend {
fun PlaybackRenderBackend.normalizeSupportedBackend(): PlaybackRenderBackend =
when (this) {
PlaybackRenderBackend.STANDARD_EXO -> PlaybackRenderBackend.STANDARD_EXO
PlaybackRenderBackend.EXPERIMENTAL_GL -> PlaybackRenderBackend.EXPERIMENTAL_GL
PlaybackRenderBackend.EXPERIMENTAL_GL -> PlaybackRenderBackend.STANDARD_EXO
PlaybackRenderBackend.EXPERIMENTAL_MPV_ANDROID -> PlaybackRenderBackend.EXPERIMENTAL_MPV_EMBEDDED
PlaybackRenderBackend.EXPERIMENTAL_MPV_EMBEDDED -> PlaybackRenderBackend.EXPERIMENTAL_MPV_EMBEDDED
PlaybackRenderBackend.EXPERIMENTAL_IJKPLAYER -> PlaybackRenderBackend.EXPERIMENTAL_IJKPLAYER
Expand All @@ -25,7 +26,6 @@ fun PlaybackRenderBackend.normalizeSupportedBackend(): PlaybackRenderBackend =
fun supportedPlaybackRenderBackends(): List<PlaybackRenderBackend> =
listOf(
PlaybackRenderBackend.STANDARD_EXO,
PlaybackRenderBackend.EXPERIMENTAL_GL,
PlaybackRenderBackend.EXPERIMENTAL_MPV_EMBEDDED,
PlaybackRenderBackend.EXPERIMENTAL_IJKPLAYER,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class PlaybackPreferencesManagerTest {
}

@Test
fun `manager persists and reloads customized format-aware tone mapping preferences`() = runBlocking {
fun `manager migrates legacy gl backend while preserving tone mapping preferences`() = runBlocking {
val updated = FormatAwareToneMappingPreferences(
defaultBackend = PlaybackRenderBackend.EXPERIMENTAL_GL,
rules = FormatAwareToneMappingPreferences().rules + (
Expand All @@ -119,7 +119,7 @@ class PlaybackPreferencesManagerTest {

val restored = manager.getFormatAwareToneMappingPreferences()

assertEquals(PlaybackRenderBackend.EXPERIMENTAL_GL, restored.defaultBackend)
assertEquals(PlaybackRenderBackend.STANDARD_EXO, restored.defaultBackend)
assertEquals(
ToneMappingCurvePreset.REINHARD,
restored.rules.getValue(VideoRenderRuleKey.HDR10).curvePreset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private fun buildLinearPhaseFilter(preset: com.miruplay.tv.model.AudioDspPreset)
}
val response = FrequencyResponse.sample(plan, frequencies)
val entries = response.frequenciesHz.indices.joinToString(";") { index ->
"${number(response.frequenciesHz[index])}:${number(response.magnitudeDb[index])}"
"entry(${number(response.frequenciesHz[index])},${number(response.magnitudeDb[index])})"
}
val delaySeconds = plan.groupDelayFrames.toDouble() / DSP_SAMPLE_RATE_HZ
return "firequalizer=gain_entry='$entries':delay=${number(delaySeconds)}:multi=true:zero_phase=false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.miruplay.tv.player

import android.app.ActivityManager
import android.content.Context
import android.content.pm.ConfigurationInfo

fun resolveGlEsMajorVersion(reqGlEsVersion: Int): Int =
when {
reqGlEsVersion == ConfigurationInfo.GL_ES_VERSION_UNDEFINED -> 2
reqGlEsVersion <= 0 -> 2
else -> reqGlEsVersion shr 16
}

fun resolveDeviceGlEsMajorVersion(context: Context): Int {
val activityManager = context.getSystemService(ActivityManager::class.java)
val reqGlEsVersion = activityManager?.deviceConfigurationInfo?.reqGlEsVersion
?: ConfigurationInfo.GL_ES_VERSION_UNDEFINED
return resolveGlEsMajorVersion(reqGlEsVersion)
}
37 changes: 0 additions & 37 deletions player-core/src/main/kotlin/com/miruplay/tv/player/DiModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -54,40 +54,6 @@ object PlayerModule {
}
}

@Provides
@Singleton
@ExperimentalPlaybackPlayer
fun provideExperimentalExoPlayer(
@ApplicationContext context: Context,
dataSourceFactory: PlaybackDataSourceFactory,
audioDspRuntimeConfig: AudioDspRuntimeConfig,
): ExoPlayer {
val libassSession = LibassSubtitleSession()
val nativeAssAvailable = NativeAssRenderer.isAvailable()
val renderersFactory = ExperimentalRenderersFactory(context, audioDspRuntimeConfig, libassSession)
// The experimental HDR backend relies on stable HEVC surface attachment across
// vendor codecs, so we bias toward compatibility over async throughput here.
.forceDisableMediaCodecAsynchronousQueueing()
.setEnableDecoderFallback(true)
.setMediaCodecSelector(PlaybackMediaCodecSelector)

return ExoPlayer.Builder(context, renderersFactory)
.setMediaSourceFactory(
DefaultMediaSourceFactory(
ZlibSubtitleProtectingDataSourceFactory(dataSourceFactory),
ZlibSubtitleExtractorsFactory(
session = libassSession,
nativeAvailable = { nativeAssAvailable },
),
),
)
.build()
.also { player ->
LibassSubtitleRegistry.register(player, libassSession)
if (nativeAssAvailable) player.setVideoFrameMetadataListener(libassSession)
}
}

@Provides
@Singleton
fun providePlaybackConfig(): PlaybackConfig = PlaybackConfig()
Expand All @@ -98,8 +64,6 @@ object PlayerModule {
@ApplicationContext context: Context,
@StandardPlaybackPlayer
standardPlayerProvider: javax.inject.Provider<ExoPlayer>,
@ExperimentalPlaybackPlayer
experimentalPlayerProvider: javax.inject.Provider<ExoPlayer>,
dataSourceFactory: PlaybackDataSourceFactory,
httpRequestResolver: PlaybackHttpRequestResolver,
playbackPreferencesRepository: PlaybackPreferencesRepository,
Expand All @@ -111,7 +75,6 @@ object PlayerModule {
return ExoPlaybackController(
context = context,
standardExoPlayerProvider = standardPlayerProvider,
experimentalExoPlayerProvider = experimentalPlayerProvider,
dataSourceFactory = dataSourceFactory,
httpRequestResolver = httpRequestResolver,
playbackPreferencesRepository = playbackPreferencesRepository,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ fun buildEmbeddedMpvSessionOptions(
shaderPaths: List<String>,
speed: Float = 1.0f,
runtimeAbiIs32Bit: Boolean = isEmbeddedMpvRuntime32Bit(),
glEsMajorVersion: Int = 3,
debugConfig: EmbeddedMpvDebugConfig = EmbeddedMpvDebugConfig(),
audioDspConfig: AudioDspConfig = AudioDspConfig.neutral(),
): MiruMpvSurfaceView.SessionOptions {
Expand All @@ -26,6 +27,7 @@ fun buildEmbeddedMpvSessionOptions(
return MiruMpvSurfaceView.SessionOptions(
vo = effectiveEmbeddedMpvVideoOutput(
runtimeAbiIs32Bit = runtimeAbiIs32Bit,
glEsMajorVersion = glEsMajorVersion,
debugConfig = debugConfig,
),
hwdec = effectiveEmbeddedMpvHwdec(debugConfig),
Expand Down Expand Up @@ -130,8 +132,13 @@ private fun resolveEmbeddedMpvPeakDetection(strategy: PeakDetectionStrategy): Em

fun effectiveEmbeddedMpvVideoOutput(
runtimeAbiIs32Bit: Boolean = isEmbeddedMpvRuntime32Bit(),
glEsMajorVersion: Int = 3,
debugConfig: EmbeddedMpvDebugConfig = EmbeddedMpvDebugConfig(),
): String = debugConfig.vo ?: if (runtimeAbiIs32Bit) "gpu-hq" else "gpu-next"
): String = debugConfig.vo ?: when {
glEsMajorVersion < 3 -> "mediacodec_embed"
runtimeAbiIs32Bit -> "gpu-hq"
else -> "gpu-next"
}

fun effectiveEmbeddedMpvHwdec(
debugConfig: EmbeddedMpvDebugConfig = EmbeddedMpvDebugConfig(),
Expand Down
Loading
Loading