diff --git a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 049ef690..cb6f8699 100644 --- a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -161,7 +161,7 @@ public class ReactExoplayerView extends FrameLayout implements AdEvent.AdEventListener, AdErrorEvent.AdErrorListener { - public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1; + public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 0.5; public static final double DEFAULT_MIN_BUFFER_MEMORY_RESERVE = 0; private static final String TAG = "ReactExoplayerView"; @@ -244,7 +244,7 @@ public class ReactExoplayerView extends FrameLayout implements private BufferingStrategy.BufferingStrategyEnum bufferingStrategy; private boolean disableDisconnectError; private boolean preventsDisplaySleepDuringVideoPlayback = true; - private float mProgressUpdateInterval = 500.0f; + private float mProgressUpdateInterval = 1000.0f; protected boolean playInBackground = false; private boolean mReportBandwidth = false; private boolean controls = false; @@ -642,6 +642,8 @@ public class ReactExoplayerView extends FrameLayout implements } private void initializePlayer() { + drmRetryCount = 0; + hasDrmFailed = false; disableCache = ReactNativeVideoManager.Companion.getInstance().shouldDisableCache(source); ReactExoplayerView self = this; @@ -664,10 +666,14 @@ public class ReactExoplayerView extends FrameLayout implements PictureInPictureUtil.applyAutoEnterEnabled(themedReactContext, pictureInPictureParamsBuilder, this.enterPictureInPictureOnLeave); } - if (!source.isLocalAssetFile() && !source.isAsset() && source.getBufferConfig().getCacheSize() > 0) { + long requestedCacheSize = source.getBufferConfig().getCacheSize(); + long MAX_SAFE_CACHE_SIZE = 100L * 1024 * 1024; + long effectiveCacheSize = Math.min(requestedCacheSize, MAX_SAFE_CACHE_SIZE); + if (!source.isLocalAssetFile() && !source.isAsset() && effectiveCacheSize > 0) { RNVSimpleCache.INSTANCE.setSimpleCache( this.getContext(), - source.getBufferConfig().getCacheSize()); + effectiveCacheSize + ); useCache = true; } else { useCache = false; @@ -876,13 +882,10 @@ public class ReactExoplayerView extends FrameLayout implements MediaSource mediaSource = Objects.requireNonNullElse(mediaSourceWithAds, videoSource); // wait for player to be set - while (player == null) { - try { - wait(); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - DebugLog.e(TAG, ex.toString()); - } + if (player == null) { + DebugLog.w(TAG, "Player not ready yet, aborting source initialization"); + playerNeedsSource = true; + return; } boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; @@ -1993,13 +1996,15 @@ public class ReactExoplayerView extends FrameLayout implements if (!hasDrmFailed) { // When DRM fails to reach the app level certificate server it will fail with a // source error so we assume that it is DRM related and try one more time - hasDrmFailed = true; - playerNeedsSource = true; - updateResumePosition(); - initializePlayer(); - setPlayWhenReady(true); - return; - } + if (drmRetryCount < 1) { + drmRetryCount++; + hasDrmFailed = true; + playerNeedsSource = true; + updateResumePosition(); + initializePlayer(); + setPlayWhenReady(true); + return; + } break; default: break;