From 440fb41f1c00c0248008166da77bf462b6ec88f4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 13 Mar 2025 10:36:03 +0100 Subject: [PATCH] Reduce the buffering when looping through GIF --- .../mastodon/ui/drawer/StatusAdapter.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java index 23dc5f9d..9ba44d28 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java @@ -92,8 +92,11 @@ import androidx.media3.common.MediaItem; import androidx.media3.common.Player; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.DefaultDataSource; +import androidx.media3.exoplayer.DefaultLoadControl; import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.exoplayer.LoadControl; import androidx.media3.exoplayer.source.ProgressiveMediaSource; +import androidx.media3.exoplayer.upstream.DefaultAllocator; import androidx.media3.ui.PlayerView; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; @@ -1728,7 +1731,18 @@ public class StatusAdapter extends RecyclerView.Adapter .createMediaSource(mediaItem); } try { - ExoPlayer player = new ExoPlayer.Builder(context).build(); + int MIN_BUFFER_DURATION = 1000; + int MIN_PLAYBACK_RESUME_BUFFER = 1024; + int MIN_PLAYBACK_START_BUFFER = 1024; + DefaultLoadControl defaultLoadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, 16)) + .setBufferDurationsMs(MIN_BUFFER_DURATION, + MIN_BUFFER_DURATION*5, + MIN_PLAYBACK_START_BUFFER, + MIN_PLAYBACK_RESUME_BUFFER) + .setTargetBufferBytes(-1) + .setPrioritizeTimeOverSizeThresholds(true).build(); + ExoPlayer player = new ExoPlayer.Builder(context).setLoadControl(defaultLoadControl).build(); player.setRepeatMode(Player.REPEAT_MODE_ONE); layoutMediaBinding.mediaVideo.setPlayer(player); player.setMediaSource(videoSource); @@ -1800,7 +1814,18 @@ public class StatusAdapter extends RecyclerView.Adapter .createMediaSource(mediaItem); } try { - ExoPlayer player = new ExoPlayer.Builder(context).build(); + int MIN_BUFFER_DURATION = 1000; + int MIN_PLAYBACK_RESUME_BUFFER = 1024; + int MIN_PLAYBACK_START_BUFFER = 1024; + DefaultLoadControl defaultLoadControl = new DefaultLoadControl.Builder() + .setAllocator(new DefaultAllocator(true, 16)) + .setBufferDurationsMs(MIN_BUFFER_DURATION, + MIN_BUFFER_DURATION*5, + MIN_PLAYBACK_START_BUFFER, + MIN_PLAYBACK_RESUME_BUFFER) + .setTargetBufferBytes(-1) + .setPrioritizeTimeOverSizeThresholds(true).build(); + ExoPlayer player = new ExoPlayer.Builder(context).setLoadControl(defaultLoadControl).build(); player.setRepeatMode(Player.REPEAT_MODE_ONE); layoutMediaBinding.mediaVideo.setPlayer(player); player.setMediaSource(videoSource);