From f10511d9534257a8fc9a4a47978d9c844428f1f7 Mon Sep 17 00:00:00 2001
From: Olivier Bouillet <62574056+freeboub@users.noreply.github.com>
Date: Thu, 28 Mar 2024 21:33:17 +0100
Subject: [PATCH] fix(android): improve and backBufferDurationMs. mainly let
exoplayer manage the prop (#3619)
BREAKING CHANGE: move backBufferDurationMs from root props to bufferConfig
---
.../exoplayer/ReactExoplayerView.java | 19 +++----------------
.../exoplayer/ReactExoplayerViewManager.java | 11 ++++-------
docs/pages/component/props.mdx | 11 +++--------
src/specs/VideoNativeComponent.ts | 2 +-
src/types/video.ts | 2 +-
5 files changed, 12 insertions(+), 33 deletions(-)
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
index c13118aa..41eb06e8 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
+++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
@@ -191,6 +191,7 @@ public class ReactExoplayerView extends FrameLayout implements
private int maxBufferMs = DefaultLoadControl.DEFAULT_MAX_BUFFER_MS;
private int bufferForPlaybackMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS;
private int bufferForPlaybackAfterRebufferMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS;
+ private int backBufferDurationMs = DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS;
private double maxHeapAllocationPercent = ReactExoplayerView.DEFAULT_MAX_HEAP_ALLOCATION_PERCENT;
private double minBackBufferMemoryReservePercent = ReactExoplayerView.DEFAULT_MIN_BACK_BUFFER_MEMORY_RESERVE;
private double minBufferMemoryReservePercent = ReactExoplayerView.DEFAULT_MIN_BUFFER_MEMORY_RESERVE;
@@ -198,7 +199,6 @@ public class ReactExoplayerView extends FrameLayout implements
private Runnable mainRunnable;
// Props from React
- private int backBufferDurationMs = DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS;
private Uri srcUri;
private long startPositionMs = -1;
private long cropStartMs = -1;
@@ -1944,20 +1944,6 @@ public class ReactExoplayerView extends FrameLayout implements
exoPlayerView.setFocusable(this.focusable);
}
- public void setBackBufferDurationMs(int backBufferDurationMs) {
- Runtime runtime = Runtime.getRuntime();
- long usedMemory = runtime.totalMemory() - runtime.freeMemory();
- long freeMemory = runtime.maxMemory() - usedMemory;
- long reserveMemory = (long)minBackBufferMemoryReservePercent * runtime.maxMemory();
- if (reserveMemory > freeMemory) {
- // We don't have enough memory in reserve so we will
- DebugLog.w("ExoPlayer Warning", "Not enough reserve memory, setting back buffer to 0ms to reduce memory pressure!");
- this.backBufferDurationMs = 0;
- return;
- }
- this.backBufferDurationMs = backBufferDurationMs;
- }
-
public void setContentStartTime(int contentStartTime) {
this.contentStartTime = contentStartTime;
}
@@ -2043,7 +2029,7 @@ public class ReactExoplayerView extends FrameLayout implements
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 newBackBufferDurationMs) {
minBufferMs = newMinBufferMs;
maxBufferMs = newMaxBufferMs;
bufferForPlaybackMs = newBufferForPlaybackMs;
@@ -2051,6 +2037,7 @@ public class ReactExoplayerView extends FrameLayout implements
maxHeapAllocationPercent = newMaxHeapAllocationPercent;
minBackBufferMemoryReservePercent = newMinBackBufferMemoryReservePercent;
minBufferMemoryReservePercent = newMinBufferMemoryReservePercent;
+ backBufferDurationMs = newBackBufferDurationMs;
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 27b3f99d..a6993c32 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
+++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
@@ -58,7 +58,6 @@ public class ReactExoplayerViewManager extends ViewGroupManager
-
-The number of milliseconds of buffer to keep before the current position. This allows rewinding without rebuffering within that duration.
-
### `bufferConfig`
@@ -76,11 +70,11 @@ Adjust the buffer settings. This prop takes an object with one or more of the pr
| maxBufferMs | number | The default maximum duration of media that the player will attempt to buffer, in milliseconds. |
| bufferForPlaybackMs | number | The default duration of media that must be buffered for playback to start or resume following a user action such as a seek, in milliseconds. |
| bufferForPlaybackAfterRebufferMs | number | The default duration of media that must be buffered for playback to resume after a rebuffer, in milliseconds. A rebuffer is defined to be caused by buffer depletion rather than a user action. |
+| backBufferDurationMs | number | The number of milliseconds of buffer to keep before the current position. This allows rewinding without rebuffering within that duration. |
| maxHeapAllocationPercent | number | The percentage of available heap that the video can use to buffer, between 0 and 1 |
| minBackBufferMemoryReservePercent | number | The percentage of available app memory at which during startup the back buffer will be disabled, between 0 and 1 |
| minBufferMemoryReservePercent | number | The percentage of available app memory to keep in reserve that prevents buffer from using it, between 0 and 1 |
-This prop should only be set when you are setting the source, changing it after the media is loaded will cause it to be reloaded.
Example with default values:
@@ -89,7 +83,8 @@ bufferConfig={{
minBufferMs: 15000,
maxBufferMs: 50000,
bufferForPlaybackMs: 2500,
- bufferForPlaybackAfterRebufferMs: 5000
+ bufferForPlaybackAfterRebufferMs: 5000,
+ backBufferDurationMs: 120000,
}}
```
diff --git a/src/specs/VideoNativeComponent.ts b/src/specs/VideoNativeComponent.ts
index fd53d328..53e65bd2 100644
--- a/src/specs/VideoNativeComponent.ts
+++ b/src/specs/VideoNativeComponent.ts
@@ -108,6 +108,7 @@ type BufferConfig = Readonly<{
bufferForPlaybackMs?: Float;
bufferForPlaybackAfterRebufferMs?: Float;
maxHeapAllocationPercent?: Float;
+ backBufferDurationMs?: Float; // Android
minBackBufferMemoryReservePercent?: Float;
minBufferMemoryReservePercent?: Float;
}>;
@@ -484,7 +485,6 @@ export interface VideoNativeProps extends ViewProps {
localSourceEncryptionKeyScheme?: string;
debug?: DebugConfig;
- backBufferDurationMs?: Int32; // Android
bufferConfig?: BufferConfig; // Android
contentStartTime?: Int32; // Android
currentPlaybackTime?: Double; // Android
diff --git a/src/types/video.ts b/src/types/video.ts
index 010be36e..e3489224 100644
--- a/src/types/video.ts
+++ b/src/types/video.ts
@@ -68,6 +68,7 @@ export type BufferConfig = {
maxBufferMs?: number;
bufferForPlaybackMs?: number;
bufferForPlaybackAfterRebufferMs?: number;
+ backBufferDurationMs?: number; // Android
maxHeapAllocationPercent?: number;
minBackBufferMemoryReservePercent?: number;
minBufferMemoryReservePercent?: number;
@@ -188,7 +189,6 @@ export interface ReactVideoProps extends ReactVideoEvents, ViewProps {
audioOnly?: boolean;
audioOutput?: AudioOutput; // Mobile
automaticallyWaitsToMinimizeStalling?: boolean; // iOS
- backBufferDurationMs?: number; // Android
bufferConfig?: BufferConfig; // Android
chapters?: Chapters[]; // iOS
contentStartTime?: number; // Android