Add developer preference to prefer extension renderers to core ones
This commit is contained in:
committed by
Niels van Velzen
parent
2b1143a362
commit
1235eb1ff5
@@ -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))
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -5,4 +5,5 @@ import kotlin.time.Duration
|
||||
data class ExoPlayerOptions(
|
||||
val httpConnectTimeout: Duration? = null,
|
||||
val httpReadTimeout: Duration? = null,
|
||||
val preferFfmpeg: Boolean = false,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user