diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 55d7dd1acb..3c4a8f066f 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -16,6 +16,7 @@ import android.os.Looper; import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.View; import android.view.Window; import android.view.accessibility.CaptioningManager; @@ -42,6 +43,10 @@ import androidx.media3.common.TrackSelectionOverride; import androidx.media3.common.Tracks; import androidx.media3.common.util.Util; +import androidx.media3.database.StandaloneDatabaseProvider; +import androidx.media3.datasource.cache.CacheDataSource; +import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor; +import androidx.media3.datasource.cache.SimpleCache; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.DataSpec; import androidx.media3.datasource.HttpDataSource; @@ -111,6 +116,7 @@ import com.google.ads.interactivemedia.v3.api.AdErrorEvent; import com.google.common.collect.ImmutableList; +import java.io.File; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; @@ -185,6 +191,7 @@ public class ReactExoplayerView extends FrameLayout implements private boolean isUsingContentResolution = false; private boolean selectTrackWhenReady = false; + private DataSource.Factory cacheDataSourceFactory; private int minBufferMs = DefaultLoadControl.DEFAULT_MIN_BUFFER_MS; private int maxBufferMs = DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; private int bufferForPlaybackMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS; @@ -634,8 +641,11 @@ private void initializePlayerCore(ReactExoplayerView self) { .setAdEventListener(this) .setAdErrorListener(this) .build(); - DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory); + if (cacheDataSourceFactory != null) { + mediaSourceFactory.setDataSourceFactory(cacheDataSourceFactory); + } + if (adsLoader != null) { mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView); } @@ -830,9 +840,16 @@ private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessi ); break; case CONTENT_TYPE_OTHER: - mediaSourceFactory = new ProgressiveMediaSource.Factory( - mediaDataSourceFactory - ); + if (cacheDataSourceFactory == null) { + mediaSourceFactory = new ProgressiveMediaSource.Factory( + mediaDataSourceFactory + ); + } else { + mediaSourceFactory = new ProgressiveMediaSource.Factory( + cacheDataSourceFactory + ); + + } break; default: { throw new IllegalStateException("Unsupported type: " + type); @@ -2025,7 +2042,7 @@ public void setHideShutterView(boolean hideShutterView) { exoPlayerView.setHideShutterView(hideShutterView); } - public void setBufferConfig(int newMinBufferMs, int newMaxBufferMs, int newBufferForPlaybackMs, int newBufferForPlaybackAfterRebufferMs, double newMaxHeapAllocationPercent, double newMinBackBufferMemoryReservePercent, double newMinBufferMemoryReservePercent) { + public void setBufferConfig(int newMinBufferMs, int newMaxBufferMs, int newBufferForPlaybackMs, int newBufferForPlaybackAfterRebufferMs, double newMaxHeapAllocationPercent, double newMinBackBufferMemoryReservePercent, double newMinBufferMemoryReservePercent, int bufferSize) { minBufferMs = newMinBufferMs; maxBufferMs = newMaxBufferMs; bufferForPlaybackMs = newBufferForPlaybackMs; @@ -2033,6 +2050,11 @@ public void setBufferConfig(int newMinBufferMs, int newMaxBufferMs, int newBuffe maxHeapAllocationPercent = newMaxHeapAllocationPercent; minBackBufferMemoryReservePercent = newMinBackBufferMemoryReservePercent; minBufferMemoryReservePercent = newMinBufferMemoryReservePercent; + SimpleCache simpleCache = new SimpleCache(new File(this.getContext().getCacheDir(), "RNVCache"), new LeastRecentlyUsedCacheEvictor((long) bufferSize*1024*1024), new StandaloneDatabaseProvider(this.getContext())); + cacheDataSourceFactory = + new CacheDataSource.Factory() + .setCache(simpleCache) + .setUpstreamDataSourceFactory(buildHttpDataSourceFactory(false)); releasePlayer(); initializePlayer(); } diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index 8536bc2b5c..1099b8417f 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -61,6 +61,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager { - this.channelUp(); + // this.channelUp(); }; toggleFullscreen() { @@ -759,10 +759,17 @@ class VideoPlayer extends Component { onAspectRatio={this.onAspectRatio} onReadyForDisplay={this.onReadyForDisplay} onBuffer={this.onVideoBuffer} - repeat={this.state.loop} + repeat selectedTextTrack={this.state.selectedTextTrack} selectedAudioTrack={this.state.selectedAudioTrack} playInBackground={false} + bufferConfig={{ + minBufferMs: 15000, + maxBufferMs: 50000, + bufferForPlaybackMs: 2500, + bufferForPlaybackAfterRebufferMs: 5000, + bufferSize: 200, + }} /> ); diff --git a/src/VideoNativeComponent.ts b/src/VideoNativeComponent.ts index 9692356129..90032917de 100644 --- a/src/VideoNativeComponent.ts +++ b/src/VideoNativeComponent.ts @@ -103,6 +103,7 @@ type BufferConfig = Readonly<{ maxHeapAllocationPercent?: number; minBackBufferMemoryReservePercent?: number; minBufferMemoryReservePercent?: number; + bufferSize?: number; }>; type SelectedVideoTrack = Readonly<{