diff --git a/CHANGELOG.md b/CHANGELOG.md index 931a7712b..e5d328b86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/ios/THEOplayerRCTPlayerAPI.swift b/ios/THEOplayerRCTPlayerAPI.swift index 27a2f3e8c..d194c1b6b 100644 --- a/ios/THEOplayerRCTPlayerAPI.swift +++ b/ios/THEOplayerRCTPlayerAPI.swift @@ -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.. 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.. 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.. 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.. 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.") } } } diff --git a/ios/THEOplayerRCTTrackMetadataAggregator.swift b/ios/THEOplayerRCTTrackMetadataAggregator.swift index 8e0700e93..2390aad30 100644 --- a/ios/THEOplayerRCTTrackMetadataAggregator.swift +++ b/ios/THEOplayerRCTTrackMetadataAggregator.swift @@ -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.. 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.. [[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.. [String:Any]? in + guard index < audioTrack.qualities.count else { return nil } return THEOplayerRCTTrackMetadataAggregator.aggregatedQualityInfo(quality: audioTrack.qualities.get(index)) } @@ -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.. [[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.. [String:Any]? in + guard index < videoTrack.qualities.count else { return nil } return THEOplayerRCTTrackMetadataAggregator.aggregatedQualityInfo(quality: videoTrack.qualities.get(index)) } @@ -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..