Remove libass library
This commit is contained in:
committed by
Niels van Velzen
parent
3902d6ac93
commit
ef53924ccd
@@ -136,7 +136,6 @@ dependencies {
|
||||
implementation(libs.androidx.media3.exoplayer.hls)
|
||||
implementation(libs.androidx.media3.ui)
|
||||
implementation(libs.jellyfin.androidx.media3.ffmpeg.decoder)
|
||||
implementation(libs.libass.media3)
|
||||
|
||||
// Markdown
|
||||
implementation(libs.bundles.markwon)
|
||||
|
||||
@@ -68,7 +68,6 @@ fun Scope.createPlaybackManager() = playbackManager(androidContext()) {
|
||||
val userPreferences = get<UserPreferences>()
|
||||
val exoPlayerOptions = ExoPlayerOptions(
|
||||
preferFfmpeg = userPreferences[UserPreferences.preferExoPlayerFfmpeg],
|
||||
enableLibass = userPreferences[UserPreferences.assDirectPlay],
|
||||
enableDebugLogging = userPreferences[UserPreferences.debuggingEnabled],
|
||||
baseDataSourceFactory = get<HttpDataSource.Factory>(),
|
||||
)
|
||||
|
||||
@@ -248,11 +248,6 @@ class UserPreferences(context: Context) : SharedPreferenceStore(
|
||||
*/
|
||||
var trickPlayEnabled = booleanPreference("trick_play_enabled", false)
|
||||
|
||||
/**
|
||||
* Enable libass.
|
||||
*/
|
||||
var assDirectPlay = booleanPreference("libass_enabled", false)
|
||||
|
||||
/**
|
||||
* Enable PGS subtitle direct-play.
|
||||
*/
|
||||
|
||||
@@ -37,7 +37,6 @@ import androidx.media3.exoplayer.source.DefaultMediaSourceFactory;
|
||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector;
|
||||
import androidx.media3.exoplayer.util.EventLogger;
|
||||
import androidx.media3.extractor.DefaultExtractorsFactory;
|
||||
import androidx.media3.extractor.ExtractorsFactory;
|
||||
import androidx.media3.extractor.ts.TsExtractor;
|
||||
import androidx.media3.ui.AspectRatioFrameLayout;
|
||||
import androidx.media3.ui.CaptionStyleCompat;
|
||||
@@ -58,12 +57,6 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import io.github.peerless2012.ass.media.AssHandler;
|
||||
import io.github.peerless2012.ass.media.factory.AssRenderersFactory;
|
||||
import io.github.peerless2012.ass.media.kt.AssPlayerKt;
|
||||
import io.github.peerless2012.ass.media.parser.AssSubtitleParserFactory;
|
||||
import io.github.peerless2012.ass.media.type.AssRenderType;
|
||||
import io.github.peerless2012.ass.media.widget.AssSubtitleView;
|
||||
import timber.log.Timber;
|
||||
|
||||
@OptIn(markerClass = UnstableApi.class)
|
||||
@@ -93,10 +86,7 @@ public class VideoManager {
|
||||
_helper = helper;
|
||||
nightModeEnabled = userPreferences.get(UserPreferences.Companion.getAudioNightMode());
|
||||
|
||||
boolean assDirectPlay = userPreferences.get(UserPreferences.Companion.getAssDirectPlay());
|
||||
AssHandler assHandler = assDirectPlay ? new AssHandler(AssRenderType.OVERLAY) : null;
|
||||
|
||||
mExoPlayer = configureExoplayerBuilder(activity, assHandler).build();
|
||||
mExoPlayer = configureExoplayerBuilder(activity).build();
|
||||
|
||||
if (userPreferences.get(UserPreferences.Companion.getDebuggingEnabled())) {
|
||||
mExoPlayer.addAnalyticsListener(new EventLogger());
|
||||
@@ -128,11 +118,6 @@ public class VideoManager {
|
||||
mExoPlayerView.getSubtitleView().setBottomPaddingFraction(userPreferences.get(UserPreferences.Companion.getSubtitlesOffsetPosition()));
|
||||
mExoPlayerView.getSubtitleView().setStyle(subtitleStyle);
|
||||
|
||||
if (assHandler != null) {
|
||||
assHandler.init(mExoPlayer);
|
||||
mExoPlayerView.getSubtitleView().addView(new AssSubtitleView(mActivity, assHandler));
|
||||
}
|
||||
|
||||
mExoPlayer.addListener(new Player.Listener() {
|
||||
@Override
|
||||
public void onPlayerError(@NonNull PlaybackException error) {
|
||||
@@ -211,7 +196,7 @@ public class VideoManager {
|
||||
* @param context The associated context
|
||||
* @return A configured builder for Exoplayer
|
||||
*/
|
||||
private ExoPlayer.Builder configureExoplayerBuilder(Context context, AssHandler assHandler) {
|
||||
private ExoPlayer.Builder configureExoplayerBuilder(Context context) {
|
||||
ExoPlayer.Builder exoPlayerBuilder = new ExoPlayer.Builder(context);
|
||||
DefaultRenderersFactory defaultRendererFactory = new DefaultRenderersFactory(context);
|
||||
defaultRendererFactory.setEnableDecoderFallback(true);
|
||||
@@ -232,17 +217,8 @@ public class VideoManager {
|
||||
extractorsFactory.setConstantBitrateSeekingEnabled(true);
|
||||
extractorsFactory.setConstantBitrateSeekingAlwaysEnabled(true);
|
||||
DefaultDataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(context, exoPlayerHttpDataSourceFactory);
|
||||
if (assHandler != null) {
|
||||
AssSubtitleParserFactory assSubtitleParserFactory = new AssSubtitleParserFactory(assHandler);
|
||||
ExtractorsFactory assExtractorsFactory = AssPlayerKt.withAssMkvSupport(extractorsFactory, assSubtitleParserFactory, assHandler);
|
||||
DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(dataSourceFactory, assExtractorsFactory);
|
||||
mediaSourceFactory.setSubtitleParserFactory(assSubtitleParserFactory);
|
||||
exoPlayerBuilder.setMediaSourceFactory(mediaSourceFactory);
|
||||
exoPlayerBuilder.setRenderersFactory(new AssRenderersFactory(assHandler, defaultRendererFactory));
|
||||
} else {
|
||||
exoPlayerBuilder.setRenderersFactory(defaultRendererFactory);
|
||||
exoPlayerBuilder.setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory, extractorsFactory));
|
||||
}
|
||||
exoPlayerBuilder.setRenderersFactory(defaultRendererFactory);
|
||||
exoPlayerBuilder.setMediaSourceFactory(new DefaultMediaSourceFactory(dataSourceFactory, extractorsFactory));
|
||||
|
||||
return exoPlayerBuilder;
|
||||
}
|
||||
|
||||
@@ -47,13 +47,6 @@ class DeveloperPreferencesScreen : OptionsFragment() {
|
||||
|
||||
bind(userPreferences, UserPreferences.playbackRewriteVideoEnabled)
|
||||
}
|
||||
|
||||
checkbox {
|
||||
setTitle(R.string.preference_enable_libass)
|
||||
setContent(R.string.enable_playback_module_description)
|
||||
|
||||
bind(userPreferences, UserPreferences.assDirectPlay)
|
||||
}
|
||||
}
|
||||
|
||||
checkbox {
|
||||
|
||||
@@ -63,7 +63,7 @@ fun createDeviceProfile(
|
||||
maxBitrate = userPreferences.getMaxBitrate(),
|
||||
isAC3Enabled = userPreferences[UserPreferences.ac3Enabled],
|
||||
downMixAudio = userPreferences[UserPreferences.audioBehaviour] == AudioBehavior.DOWNMIX_TO_STEREO,
|
||||
assDirectPlay = userPreferences[UserPreferences.assDirectPlay],
|
||||
assDirectPlay = false,
|
||||
pgsDirectPlay = userPreferences[UserPreferences.pgsDirectPlay],
|
||||
jellyfinTenEleven = serverVersion >= ServerVersion(10, 11, 0),
|
||||
)
|
||||
|
||||
@@ -35,7 +35,6 @@ kotest = "6.0.4"
|
||||
kotlin = "2.2.20"
|
||||
kotlinx-coroutines = "1.10.2"
|
||||
kotlinx-serialization = "1.9.0"
|
||||
libass-android = "0.3.0-rc03"
|
||||
markwon = "4.6.2"
|
||||
mockk = "1.14.6"
|
||||
slf4j-timber = "0.0.4"
|
||||
@@ -96,7 +95,6 @@ androidx-media3-exoplayer-hls = { module = "androidx.media3:media3-exoplayer-hls
|
||||
androidx-media3-session = { module = "androidx.media3:media3-session", version.ref = "androidx-media3" }
|
||||
androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "androidx-media3" }
|
||||
jellyfin-androidx-media3-ffmpeg-decoder = { module = "org.jellyfin.media3:media3-ffmpeg-decoder", version.ref = "jellyfin-androidx-media" }
|
||||
libass-media3 = { module = "io.github.peerless2012:ass-media", version.ref = "libass-android" }
|
||||
|
||||
# Markwon
|
||||
markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" }
|
||||
|
||||
@@ -38,7 +38,6 @@ dependencies {
|
||||
implementation(libs.androidx.media3.exoplayer.hls)
|
||||
implementation(libs.jellyfin.androidx.media3.ffmpeg.decoder)
|
||||
implementation(libs.androidx.media3.ui)
|
||||
implementation(libs.libass.media3)
|
||||
|
||||
// Logging
|
||||
implementation(libs.timber)
|
||||
|
||||
@@ -23,12 +23,6 @@ import androidx.media3.exoplayer.util.EventLogger
|
||||
import androidx.media3.extractor.DefaultExtractorsFactory
|
||||
import androidx.media3.extractor.ts.TsExtractor
|
||||
import androidx.media3.ui.SubtitleView
|
||||
import io.github.peerless2012.ass.media.AssHandler
|
||||
import io.github.peerless2012.ass.media.factory.AssRenderersFactory
|
||||
import io.github.peerless2012.ass.media.kt.withAssMkvSupport
|
||||
import io.github.peerless2012.ass.media.parser.AssSubtitleParserFactory
|
||||
import io.github.peerless2012.ass.media.type.AssRenderType
|
||||
import io.github.peerless2012.ass.media.widget.AssSubtitleView
|
||||
import org.jellyfin.playback.core.backend.BasePlayerBackend
|
||||
import org.jellyfin.playback.core.mediastream.MediaStream
|
||||
import org.jellyfin.playback.core.mediastream.PlayableMediaStream
|
||||
@@ -59,11 +53,6 @@ class ExoPlayerBackend(
|
||||
private var currentStream: PlayableMediaStream? = null
|
||||
private var subtitleView: SubtitleView? = null
|
||||
private var audioPipeline = ExoPlayerAudioPipeline()
|
||||
|
||||
private val assHandler by lazy {
|
||||
AssHandler(AssRenderType.OVERLAY)
|
||||
}
|
||||
|
||||
private val exoPlayer by lazy {
|
||||
val dataSourceFactory = DefaultDataSource.Factory(
|
||||
context,
|
||||
@@ -81,14 +70,7 @@ class ExoPlayerBackend(
|
||||
setConstantBitrateSeekingAlwaysEnabled(true)
|
||||
}
|
||||
|
||||
val mediaSourceFactory = if (exoPlayerOptions.enableLibass) {
|
||||
val assSubtitleParserFactory = AssSubtitleParserFactory(assHandler)
|
||||
val assExtractorsFactory = extractorsFactory.withAssMkvSupport(assSubtitleParserFactory, assHandler)
|
||||
DefaultMediaSourceFactory(dataSourceFactory, assExtractorsFactory).apply {
|
||||
setSubtitleParserFactory(assSubtitleParserFactory)
|
||||
}
|
||||
} else DefaultMediaSourceFactory(dataSourceFactory, extractorsFactory)
|
||||
|
||||
val mediaSourceFactory = DefaultMediaSourceFactory(dataSourceFactory, extractorsFactory)
|
||||
val renderersFactory = DefaultRenderersFactory(context).apply {
|
||||
setEnableDecoderFallback(true)
|
||||
setExtensionRendererMode(
|
||||
@@ -97,9 +79,6 @@ class ExoPlayerBackend(
|
||||
false -> DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON
|
||||
}
|
||||
)
|
||||
}.let { renderersFactory ->
|
||||
if (exoPlayerOptions.enableLibass) AssRenderersFactory(assHandler, renderersFactory)
|
||||
else renderersFactory
|
||||
}
|
||||
|
||||
ExoPlayer.Builder(context)
|
||||
@@ -126,10 +105,6 @@ class ExoPlayerBackend(
|
||||
if (exoPlayerOptions.enableDebugLogging) {
|
||||
player.addAnalyticsListener(EventLogger())
|
||||
}
|
||||
|
||||
if (exoPlayerOptions.enableLibass) {
|
||||
assHandler.init(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,11 +163,7 @@ class ExoPlayerBackend(
|
||||
override fun setSubtitleView(surfaceView: PlayerSubtitleView?) {
|
||||
if (surfaceView != null) {
|
||||
if (subtitleView == null) {
|
||||
subtitleView = SubtitleView(surfaceView.context).apply {
|
||||
if (exoPlayerOptions.enableLibass) {
|
||||
addView(AssSubtitleView(surfaceView.context, assHandler))
|
||||
}
|
||||
}
|
||||
subtitleView = SubtitleView(surfaceView.context)
|
||||
}
|
||||
|
||||
surfaceView.addView(subtitleView)
|
||||
|
||||
@@ -6,6 +6,5 @@ import androidx.media3.datasource.DefaultHttpDataSource
|
||||
data class ExoPlayerOptions(
|
||||
val preferFfmpeg: Boolean = false,
|
||||
val enableDebugLogging: Boolean = false,
|
||||
val enableLibass: Boolean = false,
|
||||
val baseDataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory(),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user