Integrate with libass-android to support SSA/ASS subtitles in ExoPlayer (#1052)

## Description
Add better ASS/SSA support to ExoPlayer by using
[`libass-android`](https://github.com/peerless2012/libass-android).

This is enabled with the "Use libass for ASS subtitles" advanced
settings for ExoPlayer. It is enabled by default.

### Related issues
Related to #22
Replaces reverted #569
Fixes #1107
This commit is contained in:
Ray 2026-04-15 17:50:34 -04:00 • committed by GitHub
parent 95859be3c6
commit b18416c954
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 626 additions and 521 deletions

View file

@ -431,16 +431,18 @@ sealed interface AppPreference<Pref, T> {
summaryOn = R.string.enabled,
summaryOff = R.string.disabled,
)
val DirectPlayAss =
AppSwitchPreference<AppPreferences>(
title = R.string.direct_play_ass,
defaultValue = true,
getter = { it.playbackPreferences.overrides.directPlayAss },
val AssSubtitleMode =
AppChoicePreference<AppPreferences, AssPlaybackMode>(
title = R.string.ass_subtitle_playback,
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<AppPreferences>(
@ -1100,7 +1102,7 @@ private val ExoPlayerSettings =
AppPreference.FfmpegPreference,
AppPreference.DownMixStereo,
AppPreference.Ac3Supported,
AppPreference.DirectPlayAss,
AppPreference.AssSubtitleMode,
AppPreference.DirectPlayPgs,
AppPreference.DirectPlayDoviProfile7,
AppPreference.DecodeAv1,

View file

@ -61,10 +61,11 @@ 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 =