diff --git a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreference.kt b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreference.kt index e88c1ffb..765e41d2 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreference.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreference.kt @@ -430,16 +430,18 @@ sealed interface AppPreference { summaryOn = R.string.enabled, summaryOff = R.string.disabled, ) - val DirectPlayAss = - AppSwitchPreference( - title = R.string.direct_play_ass, - defaultValue = true, - getter = { it.playbackPreferences.overrides.directPlayAss }, + val AssSubtitleMode = + AppChoicePreference( + title = R.string.app_theme, + defaultValue = AssPlaybackMode.ASS_LIBASS, + getter = { it.playbackPreferences.overrides.assPlaybackMode }, setter = { prefs, value -> - prefs.updatePlaybackOverrides { directPlayAss = value } + prefs.updatePlaybackOverrides { assPlaybackMode = value } }, - summaryOn = R.string.enabled, - summaryOff = R.string.disabled, + displayValues = R.array.ass_subtitle_modes, + subtitles = R.array.ass_subtitle_modes_summary, + indexToValue = { AssPlaybackMode.forNumber(it) }, + valueToIndex = { if (it != AssPlaybackMode.UNRECOGNIZED) it.number else AssPlaybackMode.ASS_LIBASS.number }, ) val DirectPlayPgs = AppSwitchPreference( @@ -1097,7 +1099,7 @@ private val ExoPlayerSettings = AppPreference.FfmpegPreference, AppPreference.DownMixStereo, AppPreference.Ac3Supported, - AppPreference.DirectPlayAss, + AppPreference.AssSubtitleMode, AppPreference.DirectPlayPgs, AppPreference.DirectPlayDoviProfile7, AppPreference.DecodeAv1, diff --git a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt index e202fca3..68047896 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt @@ -61,10 +61,12 @@ class AppPreferencesSerializer .apply { ac3Supported = AppPreference.Ac3Supported.defaultValue downmixStereo = AppPreference.DownMixStereo.defaultValue - directPlayAss = AppPreference.DirectPlayAss.defaultValue +// directPlayAss = AppPreference.DirectPlayAss.defaultValue directPlayPgs = AppPreference.DirectPlayPgs.defaultValue mediaExtensionsEnabled = AppPreference.FfmpegPreference.defaultValue + assPlaybackMode = + AppPreference.AssSubtitleMode.defaultValue }.build() mpvOptions = diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt b/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt index c1507d9f..1c35a270 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt @@ -131,7 +131,7 @@ class AppUpgradeHandler it.updatePlaybackOverrides { ac3Supported = AppPreference.Ac3Supported.defaultValue downmixStereo = AppPreference.DownMixStereo.defaultValue - directPlayAss = AppPreference.DirectPlayAss.defaultValue +// directPlayAss = AppPreference.DirectPlayAss.defaultValue directPlayPgs = AppPreference.DirectPlayPgs.defaultValue } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/DeviceProfileService.kt b/app/src/main/java/com/github/damontecres/wholphin/services/DeviceProfileService.kt index a001eb6a..4405092e 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/DeviceProfileService.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/DeviceProfileService.kt @@ -1,6 +1,7 @@ package com.github.damontecres.wholphin.services import android.content.Context +import com.github.damontecres.wholphin.preferences.AssPlaybackMode import com.github.damontecres.wholphin.preferences.PlaybackPreferences import com.github.damontecres.wholphin.util.profile.MediaCodecCapabilitiesTest import com.github.damontecres.wholphin.util.profile.createDeviceProfile @@ -43,7 +44,7 @@ class DeviceProfileService maxBitrate = prefs.maxBitrate.toInt(), isAC3Enabled = prefs.overrides.ac3Supported, downMixAudio = prefs.overrides.downmixStereo, - assDirectPlay = prefs.overrides.directPlayAss, + assPlaybackMode = prefs.overrides.assPlaybackMode, pgsDirectPlay = prefs.overrides.directPlayPgs, dolbyVisionELDirectPlay = prefs.overrides.directPlayDolbyVisionEL, decodeAv1 = prefs.overrides.decodeAv1, @@ -58,7 +59,7 @@ class DeviceProfileService maxBitrate = newConfig.maxBitrate, isAC3Enabled = newConfig.isAC3Enabled, downMixAudio = newConfig.downMixAudio, - assDirectPlay = newConfig.assDirectPlay, + assDirectPlay = newConfig.assPlaybackMode != AssPlaybackMode.ASS_TRANSCODE, pgsDirectPlay = newConfig.pgsDirectPlay, dolbyVisionELDirectPlay = newConfig.dolbyVisionELDirectPlay, decodeAv1 = prefs.overrides.decodeAv1, @@ -77,7 +78,7 @@ data class DeviceProfileConfiguration( val maxBitrate: Int, val isAC3Enabled: Boolean, val downMixAudio: Boolean, - val assDirectPlay: Boolean, + val assPlaybackMode: AssPlaybackMode, val pgsDirectPlay: Boolean, val dolbyVisionELDirectPlay: Boolean, val decodeAv1: Boolean, diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/PlayerFactory.kt b/app/src/main/java/com/github/damontecres/wholphin/services/PlayerFactory.kt index a5d6fc78..335438e5 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/PlayerFactory.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/PlayerFactory.kt @@ -21,6 +21,7 @@ import androidx.media3.exoplayer.video.MediaCodecVideoRenderer import androidx.media3.exoplayer.video.VideoRendererEventListener import androidx.media3.extractor.DefaultExtractorsFactory import com.github.damontecres.wholphin.preferences.AppPreferences +import com.github.damontecres.wholphin.preferences.AssPlaybackMode import com.github.damontecres.wholphin.preferences.MediaExtensionStatus import com.github.damontecres.wholphin.preferences.PlaybackPreferences import com.github.damontecres.wholphin.preferences.PlayerBackend @@ -77,9 +78,14 @@ class PlayerFactory PlayerBackend.UNRECOGNIZED, -> { val extensions = prefs.overrides.mediaExtensionsEnabled - val directPlayAss = prefs.overrides.directPlayAss + val useLibAss = + prefs.overrides.assPlaybackMode == AssPlaybackMode.ASS_LIBASS val decodeAv1 = prefs.overrides.decodeAv1 - Timber.v("extensions=$extensions, directPlayAss=$directPlayAss") + Timber.v( + "extensions=%s, assPlaybackMode=%s", + extensions, + prefs.overrides.assPlaybackMode, + ) val rendererMode = when (extensions) { MediaExtensionStatus.MES_FALLBACK -> DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON @@ -94,7 +100,7 @@ class PlayerFactory .setEnableDecoderFallback(true) .setExtensionRendererMode(rendererMode) val mediaSourceFactory = - if (directPlayAss) { + if (useLibAss) { assHandler = AssHandler(AssRenderType.OVERLAY_OPEN_GL) val assSubtitleParserFactory = AssSubtitleParserFactory(assHandler) renderersFactory = AssRenderersFactory(assHandler, renderersFactory) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt index edea557d..7a22f006 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt @@ -66,6 +66,7 @@ import androidx.tv.material3.MaterialTheme import androidx.tv.material3.surfaceColorAtElevation import com.github.damontecres.wholphin.data.model.ItemPlayback import com.github.damontecres.wholphin.data.model.Playlist +import com.github.damontecres.wholphin.preferences.AssPlaybackMode import com.github.damontecres.wholphin.preferences.PlayerBackend import com.github.damontecres.wholphin.preferences.UserPreferences import com.github.damontecres.wholphin.preferences.skipBackOnResume @@ -440,7 +441,7 @@ fun PlaybackPageContent( setBottomPaddingFraction(it.margin.toFloat() / 100f) } playerState.assHandler?.let { assHandler -> - if (prefs.overrides.directPlayAss) { + if (prefs.overrides.assPlaybackMode == AssPlaybackMode.ASS_LIBASS) { Timber.v("Adding AssSubtitleView") addView( AssSubtitleView(context, assHandler).apply { diff --git a/app/src/main/proto/WholphinDataStore.proto b/app/src/main/proto/WholphinDataStore.proto index ce9080a7..a817fbae 100644 --- a/app/src/main/proto/WholphinDataStore.proto +++ b/app/src/main/proto/WholphinDataStore.proto @@ -40,14 +40,21 @@ message MpvOptions{ bool use_gpu_next = 2; } +enum AssPlaybackMode{ + ASS_LIBASS = 0; + ASS_EXO_PLAYER = 1; + ASS_TRANSCODE = 2; +} + message PlaybackOverrides{ bool ac3_supported = 1; bool downmix_stereo = 2; - bool direct_play_ass = 3; + bool direct_play_ass = 3 [deprecated = true]; bool direct_play_pgs = 4; MediaExtensionStatus media_extensions_enabled = 5; bool direct_play_dolby_vision_e_l = 6; bool decode_av1 = 7; + AssPlaybackMode ass_playback_mode = 8; } message PlaybackPreferences { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca8c32be..37c866dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -749,4 +749,17 @@ Separate types Prefer showing logos for titles + Direct play with libass + Direct play with ExoPlayer built-in + Burn in/transcode on server + + @string/ass_subtitle_mode_libass + @string/ass_subtitle_mode_exoplayer + @string/ass_subtitle_mode_transcode + + + @string/default_track + + +