diff --git a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt index 91c3a06d..a7be7058 100644 --- a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt +++ b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt @@ -64,11 +64,11 @@ class VideoEventEmitter { audioTracks: ArrayList, textTracks: ArrayList, videoTracks: ArrayList, - trackId: String + trackId: String? ) -> Unit lateinit var onVideoError: (errorString: String, exception: Exception, errorCode: String) -> Unit lateinit var onVideoProgress: (currentPosition: Long, bufferedDuration: Long, seekableDuration: Long, currentPlaybackTime: Double) -> Unit - lateinit var onVideoBandwidthUpdate: (bitRateEstimate: Long, height: Int, width: Int, trackId: String) -> Unit + lateinit var onVideoBandwidthUpdate: (bitRateEstimate: Long, height: Int, width: Int, trackId: String?) -> Unit lateinit var onVideoPlaybackStateChanged: (isPlaying: Boolean, isSeeking: Boolean) -> Unit lateinit var onVideoSeek: (currentPosition: Long, seekTime: Long) -> Unit lateinit var onVideoEnd: () -> Unit @@ -108,7 +108,7 @@ class VideoEventEmitter { val naturalSize: WritableMap = aspectRatioToNaturalSize(videoWidth, videoHeight) putMap("naturalSize", naturalSize) - putString("trackId", trackId) + trackId?.let { putString("trackId", it) } putArray("videoTracks", videoTracksToArray(videoTracks)) putArray("audioTracks", audioTracksToArray(audioTracks)) putArray("textTracks", textTracksToArray(textTracks)) @@ -153,9 +153,13 @@ class VideoEventEmitter { onVideoBandwidthUpdate = { bitRateEstimate, height, width, trackId -> event.dispatch(EventTypes.EVENT_BANDWIDTH) { putDouble("bitrate", bitRateEstimate.toDouble()) - putInt("width", width) - putInt("height", height) - putString("trackId", trackId) + if (width > 0) { + putInt("width", width) + } + if (height > 0) { + putInt("height", height) + } + trackId?.let { putString("trackId", it) } } } onVideoPlaybackStateChanged = { isPlaying, isSeeking -> @@ -336,15 +340,19 @@ class VideoEventEmitter { private fun aspectRatioToNaturalSize(videoWidth: Int, videoHeight: Int): WritableMap = Arguments.createMap().apply { - putInt("width", videoWidth) - putInt("height", videoHeight) - val orientation = if (videoWidth > videoHeight) { - "landscape" - } else if (videoWidth < videoHeight) { - "portrait" - } else { - "square" + if (videoWidth > 0) { + putInt("width", videoWidth) } + if (videoHeight > 0) { + putInt("height", videoHeight) + } + + val orientation = when { + videoWidth > videoHeight -> "landscape" + videoWidth < videoHeight -> "portrait" + else -> "square" + } + putString("orientation", orientation) } } diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index d9e94f4a..499e729b 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -139,7 +139,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -385,12 +384,13 @@ public class ReactExoplayerView extends FrameLayout implements public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) { if (mReportBandwidth) { if (player == null) { - eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, "-1"); + eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, null); } else { Format videoFormat = player.getVideoFormat(); - int width = videoFormat != null ? videoFormat.width : 0; - int height = videoFormat != null ? videoFormat.height : 0; - String trackId = videoFormat != null ? videoFormat.id : "-1"; + boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270); + int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; + int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; + String trackId = videoFormat != null ? videoFormat.id : null; eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, height, width, trackId); } } @@ -1427,7 +1427,7 @@ public class ReactExoplayerView extends FrameLayout implements boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270); int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0; int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0; - String trackId = videoFormat != null ? videoFormat.id : "-1"; + String trackId = videoFormat != null ? videoFormat.id : null; // Properties that must be accessed on the main thread long duration = player.getDuration(); diff --git a/docs/pages/component/events.mdx b/docs/pages/component/events.mdx index 3552d4b4..2c2f0a1d 100644 --- a/docs/pages/component/events.mdx +++ b/docs/pages/component/events.mdx @@ -222,13 +222,14 @@ Callback function that is called when the media is loaded and ready to play. Payload: | Property | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|-------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | currentTime | number | Time in seconds where the media will start | | duration | number | Length of the media in seconds | | naturalSize | object | Properties:
_ width - Width in pixels that the video was encoded at
_ height - Height in pixels that the video was encoded at
\* orientation - "portrait", "landscape" or "square" | | audioTracks | array | An array of audio track info objects with the following properties:
_ index - Index number
_ title - Description of the track
_ language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code
_ type - Mime type of track | | textTracks | array | An array of text track info objects with the following properties:
_ index - Index number
_ title - Description of the track
_ language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code
_ type - Mime type of track | | videoTracks | array | An array of video track info objects with the following properties:
_ trackId - ID for the track
_ bitrate - Bit rate in bits per second
_ codecs - Comma separated list of codecs
_ height - Height of the video
\* width - Width of the video | +| trackId | string | Provide key information about the video track, typically including: `Resolution`, `Bitrate`. | Example: @@ -260,7 +261,8 @@ Example: { index: 0, bitrate: 3987904, codecs: "avc1.640028", height: 720, trackId: "f1-v1-x3", width: 1280 }, { index: 1, bitrate: 7981888, codecs: "avc1.640028", height: 1080, trackId: "f2-v1-x3", width: 1920 }, { index: 2, bitrate: 1994979, codecs: "avc1.4d401f", height: 480, trackId: "f3-v1-x3", width: 848 } - ] + ], + trackId: "720p 2400kbps" } ```