From 11db3439873ecd5c2dc4fd26926fd757e323402e Mon Sep 17 00:00:00 2001 From: Ash Mishra Date: Mon, 29 Oct 2018 09:53:52 -0700 Subject: [PATCH 1/6] Support for HLS maximum bit rate adaptive streaming --- README.md | 3 +++ Video.js | 1 + .../brentvatne/exoplayer/ReactExoplayerView.java | 14 ++++++++++++++ .../exoplayer/ReactExoplayerViewManager.java | 6 ++++++ ios/Video/RCTVideo.m | 9 +++++++++ ios/Video/RCTVideoManager.m | 1 + 6 files changed, 34 insertions(+) diff --git a/README.md b/README.md index 96c17151..14de6397 100644 --- a/README.md +++ b/README.md @@ -583,6 +583,9 @@ Sets the media source. You can pass an asset loaded via require or an object wit The docs for this prop are incomplete and will be updated as each option is investigated and tested. +#### maximumBitRate +Sets the maximum bit rate for HLS media sources. If an HLS m3u8 manifest describes multiple streams, the maximum bit rate determines the video stream selected + ##### Asset loaded via require Example: diff --git a/Video.js b/Video.js index 77b02f0a..60bf2b02 100644 --- a/Video.js +++ b/Video.js @@ -330,6 +330,7 @@ Video.propTypes = { // Opaque type returned by require('./video.mp4') PropTypes.number ]), + maximumBitRate: PropTypes.number, resizeMode: PropTypes.string, poster: PropTypes.string, posterResizeMode: Image.propTypes.resizeMode, diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 7d69368e..2cd4b046 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -110,6 +110,7 @@ class ReactExoplayerView extends FrameLayout implements private boolean isBuffering; private float rate = 1f; private float audioVolume = 1f; + private int maximumBitRate = 0; private int minBufferMs = DefaultLoadControl.DEFAULT_MIN_BUFFER_MS; private int maxBufferMs = DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; @@ -244,6 +245,9 @@ class ReactExoplayerView extends FrameLayout implements if (player == null) { TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); + trackSelector.setParameters(trackSelector.buildUponParameters() + .setMaxVideoBitrate(maximumBitRate)); + DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); DefaultLoadControl defaultLoadControl = new DefaultLoadControl(allocator, minBufferMs, maxBufferMs, bufferForPlaybackMs, bufferForPlaybackAfterRebufferMs, -1, true); player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, defaultLoadControl); @@ -906,6 +910,16 @@ class ReactExoplayerView extends FrameLayout implements } } + public void setMaximumBitRateModifier(int newMaximumBitRate) { + if (newMaximumBitRate==0) newMaximumBitRate = Integer.MAX_VALUE; + maximumBitRate = newMaximumBitRate; + + if (player != null) { + trackSelector.setParameters(trackSelector.buildUponParameters() + .setMaxVideoBitrate(maximumBitRate)); + } + } + public void setPlayInBackground(boolean playInBackground) { this.playInBackground = playInBackground; diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index 4d1ec286..7c7f6baa 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -47,6 +47,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Sun, 4 Nov 2018 17:55:43 -0800 Subject: [PATCH 2/6] Update name to maxBitRate, remove reference to HLS --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 14de6397..d71f7e35 100644 --- a/README.md +++ b/README.md @@ -266,6 +266,7 @@ var styles = StyleSheet.create({ * [headers](#headers) * [id](#id) * [ignoreSilentSwitch](#ignoresilentswitch) +* [maxBitRate](#maxbitrate) * [muted](#muted) * [paused](#paused) * [playInBackground](#playinbackground) @@ -434,6 +435,16 @@ Controls the iOS silent switch behavior Platforms: iOS +#### maxBitRate +Sets the desired limit, in bits per second, when multiple video streams are available for a playlist. + +Example: +``` +maxBitRate={2000000} // 2 megabits +``` + +Platforms: Android ExoPlayer, iOS + #### muted Controls whether the audio is muted * **false (default)** - Don't mute audio @@ -583,8 +594,6 @@ Sets the media source. You can pass an asset loaded via require or an object wit The docs for this prop are incomplete and will be updated as each option is investigated and tested. -#### maximumBitRate -Sets the maximum bit rate for HLS media sources. If an HLS m3u8 manifest describes multiple streams, the maximum bit rate determines the video stream selected ##### Asset loaded via require From 12a482a8e397b7e877abc26f93e45ec09ccbf031 Mon Sep 17 00:00:00 2001 From: Hampton Maxwell Date: Mon, 5 Nov 2018 11:45:05 -0800 Subject: [PATCH 3/6] Make bitrate explanation more explicit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d71f7e35..8f9926bb 100644 --- a/README.md +++ b/README.md @@ -436,7 +436,7 @@ Controls the iOS silent switch behavior Platforms: iOS #### maxBitRate -Sets the desired limit, in bits per second, when multiple video streams are available for a playlist. +Sets the desired limit, in bits per second, of network bandwidth consumption when multiple video streams are available for a playlist. Example: ``` From 5ab8165c3d57ff89bd3d5b60d1c0383863d19dc4 Mon Sep 17 00:00:00 2001 From: Ash Mishra Date: Mon, 26 Nov 2018 14:50:31 -0800 Subject: [PATCH 4/6] renamed maximumBitRate to maxBitRate. Added applyModifiers support --- Video.js | 2 +- .../exoplayer/ReactExoplayerView.java | 12 +++++------ .../exoplayer/ReactExoplayerViewManager.java | 6 +++--- ios/Video/RCTVideo.m | 20 ++++++++++--------- ios/Video/RCTVideoManager.m | 2 +- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Video.js b/Video.js index 60bf2b02..a974d995 100644 --- a/Video.js +++ b/Video.js @@ -330,7 +330,7 @@ Video.propTypes = { // Opaque type returned by require('./video.mp4') PropTypes.number ]), - maximumBitRate: PropTypes.number, + maxBitRate: PropTypes.number, resizeMode: PropTypes.string, poster: PropTypes.string, posterResizeMode: Image.propTypes.resizeMode, diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 2cd4b046..7dc02c83 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -110,7 +110,7 @@ class ReactExoplayerView extends FrameLayout implements private boolean isBuffering; private float rate = 1f; private float audioVolume = 1f; - private int maximumBitRate = 0; + private int maxBitRate = 0; private int minBufferMs = DefaultLoadControl.DEFAULT_MIN_BUFFER_MS; private int maxBufferMs = DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; @@ -246,7 +246,7 @@ class ReactExoplayerView extends FrameLayout implements TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); trackSelector.setParameters(trackSelector.buildUponParameters() - .setMaxVideoBitrate(maximumBitRate)); + .setMaxVideoBitrate(maxBitRate)); DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); DefaultLoadControl defaultLoadControl = new DefaultLoadControl(allocator, minBufferMs, maxBufferMs, bufferForPlaybackMs, bufferForPlaybackAfterRebufferMs, -1, true); @@ -910,13 +910,13 @@ class ReactExoplayerView extends FrameLayout implements } } - public void setMaximumBitRateModifier(int newMaximumBitRate) { - if (newMaximumBitRate==0) newMaximumBitRate = Integer.MAX_VALUE; - maximumBitRate = newMaximumBitRate; + public void setMaxBitRateModifier(int newMaxBitRate) { + if (newMaxBitRate==0) newMaxBitRate = Integer.MAX_VALUE; + maxBitRate = newMaxBitRate; if (player != null) { trackSelector.setParameters(trackSelector.buildUponParameters() - .setMaxVideoBitrate(maximumBitRate)); + .setMaxVideoBitrate(maxBitRate)); } } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index 7c7f6baa..031f8636 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -47,7 +47,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Thu, 13 Dec 2018 09:48:28 -0800 Subject: [PATCH 5/6] Add note about 0 being the default maxBitRate --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 24d8d1c7..07fbfd88 100644 --- a/README.md +++ b/README.md @@ -448,6 +448,8 @@ Platforms: iOS #### maxBitRate Sets the desired limit, in bits per second, of network bandwidth consumption when multiple video streams are available for a playlist. +Default: 0. Don't limit the maxBitRate. + Example: ``` maxBitRate={2000000} // 2 megabits From 00dac26a6341590cc951e3832dae836db3eb18bf Mon Sep 17 00:00:00 2001 From: Hampton Maxwell Date: Thu, 13 Dec 2018 09:50:43 -0800 Subject: [PATCH 6/6] Always convert maxBitRate of 0 to Integer.MAX_VALUE --- .../java/com/brentvatne/exoplayer/ReactExoplayerView.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index c6d23ca1..a18f7cff 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -248,7 +248,7 @@ class ReactExoplayerView extends FrameLayout implements TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); trackSelector.setParameters(trackSelector.buildUponParameters() - .setMaxVideoBitrate(maxBitRate)); + .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); DefaultLoadControl defaultLoadControl = new DefaultLoadControl(allocator, minBufferMs, maxBufferMs, bufferForPlaybackMs, bufferForPlaybackAfterRebufferMs, -1, true); @@ -914,12 +914,10 @@ class ReactExoplayerView extends FrameLayout implements } public void setMaxBitRateModifier(int newMaxBitRate) { - if (newMaxBitRate==0) newMaxBitRate = Integer.MAX_VALUE; maxBitRate = newMaxBitRate; - if (player != null) { trackSelector.setParameters(trackSelector.buildUponParameters() - .setMaxVideoBitrate(maxBitRate)); + .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); } }