From 0a12f7389efaf62aec8009fa2fc8ee8f871c86df Mon Sep 17 00:00:00 2001 From: linguokun Date: Thu, 15 Nov 2018 17:57:37 +0800 Subject: [PATCH 1/3] solve the memory leak on Android and avoid the crash on kikat when call mp.selectTrack(0); --- .../com/brentvatne/react/ReactVideoView.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/brentvatne/react/ReactVideoView.java b/android/src/main/java/com/brentvatne/react/ReactVideoView.java index 3ff17a1f98..e06cee64ef 100644 --- a/android/src/main/java/com/brentvatne/react/ReactVideoView.java +++ b/android/src/main/java/com/brentvatne/react/ReactVideoView.java @@ -232,12 +232,19 @@ public void cleanupMediaPlayerResources() { mediaController.hide(); } if ( mMediaPlayer != null ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mMediaPlayer.setOnTimedMetaDataAvailableListener(null); + } mMediaPlayerValid = false; release(); } if (mIsFullscreen) { setFullscreen(false); } + if (mThemedReactContext != null) { + mThemedReactContext.removeLifecycleEventListener(this); + mThemedReactContext = null; + } } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders) { @@ -565,7 +572,10 @@ public void run() { } // Select track (so we can use it to listen to timed meta data updates) - mp.selectTrack(0); + try{ + mp.selectTrack(0); + }catch (Throwable t){ + } } @Override @@ -601,7 +611,10 @@ public boolean onInfo(MediaPlayer mp, int what, int extra) { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // Select track (so we can use it to listen to timed meta data updates) - mp.selectTrack(0); + try{ + mp.selectTrack(0); + }catch (Throwable t){ + } mVideoBufferedDuration = (int) Math.round((double) (mVideoDuration * percent) / 100.0); } From 46701448e7e235c50ee5a25f3f036973c8297645 Mon Sep 17 00:00:00 2001 From: Hampton Maxwell Date: Thu, 13 Dec 2018 12:43:11 -0800 Subject: [PATCH 2/3] Only select timed metadata tracks --- .../com/brentvatne/react/ReactVideoView.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/brentvatne/react/ReactVideoView.java b/android/src/main/java/com/brentvatne/react/ReactVideoView.java index e06cee64ef..96e49dde92 100644 --- a/android/src/main/java/com/brentvatne/react/ReactVideoView.java +++ b/android/src/main/java/com/brentvatne/react/ReactVideoView.java @@ -571,11 +571,7 @@ public void run() { }); } - // Select track (so we can use it to listen to timed meta data updates) - try{ - mp.selectTrack(0); - }catch (Throwable t){ - } + selectTimedMetadataTrack(mp); } @Override @@ -610,12 +606,7 @@ public boolean onInfo(MediaPlayer mp, int what, int extra) { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { - // Select track (so we can use it to listen to timed meta data updates) - try{ - mp.selectTrack(0); - }catch (Throwable t){ - } - + selectTimedMetadataTrack(mp); mVideoBufferedDuration = (int) Math.round((double) (mVideoDuration * percent) / 100.0); } @@ -768,4 +759,20 @@ public static Map toStringMap(@Nullable ReadableMap readableMap) return result; } + + // Select track (so we can use it to listen to timed meta data updates) + private void selectTimedMetadataTrack(MediaPlayer mp) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return; + } + try { + MediaPlayer.TrackInfo[] trackInfo = mp.getTrackInfo(); + for (int i = 0; i < trackInfo.length; ++i) { + if (trackInfo[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) { + mp.selectTrack(i); + break; + } + } + } catch (Exception e) {} + } } From b485e64c88a6e92c86cb76b7070a30dba39a5a60 Mon Sep 17 00:00:00 2001 From: Hampton Maxwell Date: Thu, 13 Dec 2018 12:50:17 -0800 Subject: [PATCH 3/3] Add note about catching selectTimedMetadataTrack exception --- android/src/main/java/com/brentvatne/react/ReactVideoView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/react/ReactVideoView.java b/android/src/main/java/com/brentvatne/react/ReactVideoView.java index 96e49dde92..03c4919012 100644 --- a/android/src/main/java/com/brentvatne/react/ReactVideoView.java +++ b/android/src/main/java/com/brentvatne/react/ReactVideoView.java @@ -765,7 +765,7 @@ private void selectTimedMetadataTrack(MediaPlayer mp) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return; } - try { + try { // It's possible this could throw an exception if the framework doesn't support getting track info MediaPlayer.TrackInfo[] trackInfo = mp.getTrackInfo(); for (int i = 0; i < trackInfo.length; ++i) { if (trackInfo[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {