Add developer preference to prefer extension renderers to core ones

This commit is contained in:
rickysixx
2024-08-22 13:00:43 +02:00
committed by Niels van Velzen
parent 2b1143a362
commit 1235eb1ff5
7 changed files with 29 additions and 4 deletions

View File

@@ -62,7 +62,8 @@ fun Scope.createPlaybackManager() = playbackManager(androidContext()) {
val api = get<ApiClient>()
val exoPlayerOptions = ExoPlayerOptions(
httpConnectTimeout = api.httpClientOptions.connectTimeout,
httpReadTimeout = api.httpClientOptions.requestTimeout
httpReadTimeout = api.httpClientOptions.requestTimeout,
preferFfmpeg = get<UserPreferences>()[UserPreferences.preferExoPlayerFfmpeg]
)
install(exoPlayerPlugin(get(), exoPlayerOptions))

View File

@@ -93,6 +93,11 @@ class UserPreferences(context: Context) : SharedPreferenceStore(
*/
var refreshRateSwitchingBehavior = enumPreference("refresh_rate_switching_behavior", RefreshRateSwitchingBehavior.DISABLED)
/**
* Whether ExoPlayer should prefer FFmpeg renderers to core ones.
*/
var preferExoPlayerFfmpeg = booleanPreference("exoplayer_prefer_ffmpeg", defaultValue = false)
/* Playback - Audio related */
/**
* Preferred behavior for audio streaming.

View File

@@ -73,10 +73,11 @@ public class VideoManager {
public boolean isContracted = false;
private final UserPreferences userPreferences = KoinJavaComponent.get(UserPreferences.class);
public VideoManager(@NonNull Activity activity, @NonNull View view, @NonNull PlaybackOverlayFragmentHelper helper) {
mActivity = activity;
_helper = helper;
UserPreferences userPreferences = KoinJavaComponent.<UserPreferences>get(UserPreferences.class);
nightModeEnabled = userPreferences.get(UserPreferences.Companion.getAudioNightMode());
mExoPlayer = configureExoplayerBuilder(activity).build();
@@ -160,6 +161,14 @@ public class VideoManager {
mPlaybackControllerNotifiable = notifier;
}
private int determineExoPlayerExtensionRendererMode() {
if (userPreferences.get(UserPreferences.Companion.getPreferExoPlayerFfmpeg())) {
return DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER;
}
return DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON;
}
/**
* Configures Exoplayer for video playback. Initially we try with core decoders, but allow
* ExoPlayer to silently fallback to software renderers.
@@ -171,7 +180,7 @@ public class VideoManager {
ExoPlayer.Builder exoPlayerBuilder = new ExoPlayer.Builder(context);
DefaultRenderersFactory defaultRendererFactory = new DefaultRenderersFactory(context);
defaultRendererFactory.setEnableDecoderFallback(true);
defaultRendererFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
defaultRendererFactory.setExtensionRendererMode(determineExoPlayerExtensionRendererMode());
exoPlayerBuilder.setRenderersFactory(defaultRendererFactory);
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);

View File

@@ -50,6 +50,13 @@ class DeveloperPreferencesScreen : OptionsFragment() {
}
}
checkbox {
setTitle(R.string.pref_prefer_extension_renderers_label)
setContent(R.string.pref_prefer_extension_renderers_description)
bind(userPreferences, UserPreferences.preferExoPlayerFfmpeg)
}
@OptIn(ExperimentalCoilApi::class)
action {
setTitle(R.string.clear_image_cache)

View File

@@ -514,6 +514,8 @@
<string name="past_week">Past week</string>
<string name="scheduled_in_next_24_hours">Scheduled in next 24 hours</string>
<string name="past_24_hours">Past 24 hours</string>
<string name="pref_prefer_extension_renderers_label">Prefer FFmpeg for audio playback</string>
<string name="pref_prefer_extension_renderers_description">Use FFmpeg to decode audio codecs when platform codecs are not available.</string>
<plurals name="seconds">
<item quantity="one">%1$s second</item>
<item quantity="other">%1$s seconds</item>

View File

@@ -57,7 +57,7 @@ class ExoPlayerBackend(
ExoPlayer.Builder(context)
.setRenderersFactory(DefaultRenderersFactory(context).apply {
setEnableDecoderFallback(true)
setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
setExtensionRendererMode(if (exoPlayerOptions.preferFfmpeg) DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER else DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
})
.setTrackSelector(DefaultTrackSelector(context).apply {
setParameters(buildUponParameters().apply {

View File

@@ -5,4 +5,5 @@ import kotlin.time.Duration
data class ExoPlayerOptions(
val httpConnectTimeout: Duration? = null,
val httpReadTimeout: Duration? = null,
val preferFfmpeg: Boolean = false,
)