Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [11.2.1] - 26-06-09

### Fixed

- Fixed an issue on iOS where setting the targetVideoQuality uids was causing a crash due to an unsafe bounds-check.

## [11.2.0] - 26-06-04

### Added
Expand Down
42 changes: 29 additions & 13 deletions ios/THEOplayerRCTPlayerAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,13 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
let player = theView.player {
let uidValue = uid.intValue
let textTracks: TextTrackList = player.textTracks
guard textTracks.count > 0 else {
let textTrackCount = textTracks.count
guard textTrackCount > 0 else {
return
}
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Showing textTrack \(uidValue) on TheoPlayer") }
for i in 0...textTracks.count-1 {
for i in 0..<textTrackCount {
guard i < textTracks.count else { break }
let textTrack: TextTrack = textTracks.get(i)
if textTrack.uid == uidValue {
textTrack.mode = TextTrackMode.showing
Expand All @@ -304,11 +306,13 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
let player = theView.player {
let uidValue = uid.intValue
let audioTracks: AudioTrackList = player.audioTracks
guard audioTracks.count > 0 else {
let audioTrackCount = audioTracks.count
guard audioTrackCount > 0 else {
return
}
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Enabling audioTrack \(uidValue) on TheoPlayer") }
for i in 0...audioTracks.count-1 {
for i in 0..<audioTrackCount {
guard i < audioTracks.count else { break }
let audioTrack: MediaTrack = audioTracks.get(i)
audioTrack.enabled = (audioTrack.uid == uidValue)
}
Expand All @@ -323,11 +327,13 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
let player = theView.player {
let uidValue = uid.intValue
let videoTracks: VideoTrackList = player.videoTracks
guard videoTracks.count > 0 else {
let videoTrackCount = videoTracks.count
guard videoTrackCount > 0 else {
return
}
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Enabling videoTrack \(uidValue) on TheoPlayer") }
for i in 0...videoTracks.count-1 {
for i in 0..<videoTrackCount {
guard i < videoTracks.count else { break }
let videoTrack: MediaTrack = videoTracks.get(i)
videoTrack.enabled = (videoTrack.uid == uidValue)
}
Expand All @@ -341,27 +347,37 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
if let theView = self.bridge.uiManager.view(forReactTag: node) as? THEOplayerRCTView,
let player = theView.player {
let videoTracks: VideoTrackList = player.videoTracks
guard videoTracks.count > 0 else {
let videoTrackCount = videoTracks.count
guard videoTrackCount > 0 else {
return
}
var activeVideoTrack: VideoTrack?
for i in 0...videoTracks.count-1 {
for i in 0..<videoTrackCount {
guard i < videoTracks.count else { break }
let videoTrack: MediaTrack = videoTracks.get(i)
if videoTrack.enabled {
activeVideoTrack = videoTrack as? VideoTrack
}
}
if let foundTrack = activeVideoTrack {
let matchingQualities = (0..<foundTrack.qualities.count).compactMap { index in
let requestedBandwidths = Set(uids.map { $0.intValue })
let currentBandwidths = Set(foundTrack.targetQualities?.map { $0.bandwidth } ?? [])
guard requestedBandwidths != currentBandwidths else {
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] targetQualities: \(uids) already set on active videotrack. Skipping update.") }
return
}
let qualityCount = foundTrack.qualities.count
let matchingQualities = (0..<qualityCount).compactMap { index -> Quality? in
guard index < foundTrack.qualities.count else { return nil }
let quality = foundTrack.qualities.get(index)
return uids.contains { $0.intValue == quality.bandwidth } ? quality : nil
return uids.contains(where: { $0.intValue == quality.bandwidth }) ? quality : nil
}
foundTrack.targetQualities = matchingQualities.count > 0 ? matchingQualities : nil
foundTrack.targetQualities = matchingQualities.isEmpty ? nil : matchingQualities
if DEBUG_PLAYER_API {
if matchingQualities.count > 0 {
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] targetQualities: \(uids) set on active videotrack. (matching: \(matchingQualities.map(\.bandwidth)))") }
PrintUtils.printLog(logText: "[NATIVE] targetQualities: \(uids) set on active videotrack. (matching: \(matchingQualities.map(\.bandwidth)))")
} else {
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] targetQualities: \(uids) set on active videotrack. (no match or empty) => no quality restriction.") }
PrintUtils.printLog(logText: "[NATIVE] targetQualities: \(uids) set on active videotrack. (no match or empty) => no quality restriction.")
}
}
}
Expand Down
48 changes: 32 additions & 16 deletions ios/THEOplayerRCTTrackMetadataAggregator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,12 @@ class THEOplayerRCTTrackMetadataAggregator {
// MARK: TEXTTRACKS
class func aggregatedTextTrackListInfo(textTracks: TextTrackList, metadataTracks: [[String:Any]], player: THEOplayer) -> [[String:Any]] {
var trackEntries:[[String:Any]] = metadataTracks
guard textTracks.count > 0 else {
let textTrackCount = textTracks.count
guard textTrackCount > 0 else {
return trackEntries
}
for i in 0...textTracks.count-1 {
for i in 0..<textTrackCount {
guard i < textTracks.count else { break }
let textTrack: TextTrack = textTracks.get(i)
trackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack, player: player))
}
Expand Down Expand Up @@ -90,10 +92,12 @@ class THEOplayerRCTTrackMetadataAggregator {
}

private class func selectedTextTrack(textTracks: TextTrackList) -> Int {
guard textTracks.count > 0 else {
let textTrackCount = textTracks.count
guard textTrackCount > 0 else {
return 0
}
for i in 0...textTracks.count-1 {
for i in 0..<textTrackCount {
guard i < textTracks.count else { break }
let textTrack: TextTrack = textTracks.get(i)
if textTrack.mode == TextTrackMode.showing {
return textTrack.uid
Expand Down Expand Up @@ -160,10 +164,12 @@ class THEOplayerRCTTrackMetadataAggregator {
// MARK: AUDIOTRACKS
private class func aggregatedAudioTrackListInfo(audioTracks: AudioTrackList) -> [[String:Any]] {
var audioTrackEntries:[[String:Any]] = []
guard audioTracks.count > 0 else {
let audioTrackCount = audioTracks.count
guard audioTrackCount > 0 else {
return audioTrackEntries
}
for i in 0...audioTracks.count-1 {
for i in 0..<audioTrackCount {
guard i < audioTracks.count else { break }
let audioTrack: MediaTrack = audioTracks.get(i) // should be casted to AudioTrack
audioTrackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack))
}
Expand All @@ -181,7 +187,9 @@ class THEOplayerRCTTrackMetadataAggregator {
entry[PROP_ENABLED] = audioTrack.enabled

// add known qualities
entry[PROP_QUALITIES] = (0..<audioTrack.qualities.count).map { index in
let audioQualityCount = audioTrack.qualities.count
entry[PROP_QUALITIES] = (0..<audioQualityCount).compactMap { index -> [String:Any]? in
guard index < audioTrack.qualities.count else { return nil }
return THEOplayerRCTTrackMetadataAggregator.aggregatedQualityInfo(quality: audioTrack.qualities.get(index))
}

Expand All @@ -193,10 +201,12 @@ class THEOplayerRCTTrackMetadataAggregator {
}

private class func selectedAudioTrack(audioTracks: AudioTrackList) -> Int {
guard audioTracks.count > 0 else {
let audioTrackCount = audioTracks.count
guard audioTrackCount > 0 else {
return 0
}
for i in 0...audioTracks.count-1 {
for i in 0..<audioTrackCount {
guard i < audioTracks.count else { break }
let audioTrack: MediaTrack = audioTracks.get(i)
if audioTrack.enabled {
return audioTrack.uid
Expand All @@ -208,10 +218,12 @@ class THEOplayerRCTTrackMetadataAggregator {
// MARK: VIDEOTRACKS
private class func aggregatedVideoTrackListInfo(videoTracks: VideoTrackList) -> [[String:Any]] {
var videoTrackEntries:[[String:Any]] = []
guard videoTracks.count > 0 else {
let videoTrackCount = videoTracks.count
guard videoTrackCount > 0 else {
return videoTrackEntries
}
for i in 0...videoTracks.count-1 {
for i in 0..<videoTrackCount {
guard i < videoTracks.count else { break }
if let videoTrack: VideoTrack = videoTracks.get(i) as? VideoTrack {
videoTrackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack))
}
Expand All @@ -230,7 +242,9 @@ class THEOplayerRCTTrackMetadataAggregator {
entry[PROP_ENABLED] = videoTrack.enabled

// add known qualities
entry[PROP_QUALITIES] = (0..<videoTrack.qualities.count).map { index in
let videoQualityCount = videoTrack.qualities.count
entry[PROP_QUALITIES] = (0..<videoQualityCount).compactMap { index -> [String:Any]? in
guard index < videoTrack.qualities.count else { return nil }
return THEOplayerRCTTrackMetadataAggregator.aggregatedQualityInfo(quality: videoTrack.qualities.get(index))
}

Expand All @@ -243,12 +257,14 @@ class THEOplayerRCTTrackMetadataAggregator {
}

private class func selectedVideoTrack(videoTracks: VideoTrackList) -> Int {
guard videoTracks.count > 0 else {
let videoTrackCount = videoTracks.count
guard videoTrackCount > 0 else {
return 0
}
for i in 0...videoTracks.count-1 {
for i in 0..<videoTrackCount {
guard i < videoTracks.count else { break }
let videoTrack: MediaTrack = videoTracks.get(i)
if videoTracks.get(i).enabled {
if videoTrack.enabled {
return videoTrack.uid
}
}
Expand All @@ -274,7 +290,7 @@ class THEOplayerRCTTrackMetadataAggregator {
"bandwidth": quality.bandwidth,
"codecs": "",
"id": identifier,
"uid": identifier,
"uid": quality.bandwidth,
"name": label,
"label": label,
"available": true,
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-native-theoplayer",
"version": "11.2.0",
"version": "11.2.1",
"description": "A THEOplayer video component for react-native.",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down
Loading