perf(ios): add early returns (#3741)

* perf(ios): add early returns

* code review

* apply code review
This commit is contained in:
Krzysztof Moch 2024-05-08 16:07:32 +02:00 committed by GitHub
parent 627e5da4c3
commit 1d235a1fea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -307,6 +307,11 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// MARK: - Progress // MARK: - Progress
func sendProgressUpdate() { func sendProgressUpdate() {
#if !USE_GOOGLE_IMA
// If we dont use Ads and onVideoProgress is not defined we dont need to run this code
guard onVideoProgress != nil else { return }
#endif
if let video = _player?.currentItem, if let video = _player?.currentItem,
video == nil || video.status != AVPlayerItem.Status.readyToPlay { video == nil || video.status != AVPlayerItem.Status.readyToPlay {
return return
@ -1300,6 +1305,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// When timeMetadata is read the event onTimedMetadata is triggered // When timeMetadata is read the event onTimedMetadata is triggered
func handleTimeMetadataChange(timedMetadata: [AVMetadataItem]) { func handleTimeMetadataChange(timedMetadata: [AVMetadataItem]) {
guard onTimedMetadata != nil else { return } guard onTimedMetadata != nil else { return }
var metadata: [[String: String?]?] = [] var metadata: [[String: String?]?] = []
for item in timedMetadata { for item in timedMetadata {
let value = item.value as? String let value = item.value as? String
@ -1331,32 +1337,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
func handleReadyToPlay() { func handleReadyToPlay() {
guard let _playerItem else { return } guard let _playerItem else { return }
var duration = Float(CMTimeGetSeconds(_playerItem.asset.duration))
if duration.isNaN || duration == 0 {
// This is a safety check for live video.
// AVPlayer report a 0 duration
duration = RCTVideoUtils.calculateSeekableDuration(_player).floatValue
if duration.isNaN {
duration = 0
}
}
var width: Float = 0
var height: Float = 0
var orientation = "undefined"
Task { Task {
let tracks = await RCTVideoAssetsUtils.getTracks(asset: _playerItem.asset, withMediaType: .video)
if let videoTrack = tracks?.first {
width = Float(videoTrack.naturalSize.width)
height = Float(videoTrack.naturalSize.height)
} else if _playerItem.presentationSize.height != 0.0 {
width = Float(_playerItem.presentationSize.width)
height = Float(_playerItem.presentationSize.height)
}
orientation = width > height ? "landscape" : width == height ? "square" : "portrait"
if self._pendingSeek { if self._pendingSeek {
self.setSeek([ self.setSeek([
"time": NSNumber(value: self._pendingSeekTime), "time": NSNumber(value: self._pendingSeekTime),
@ -1373,7 +1355,32 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self._startPosition = -1 self._startPosition = -1
} }
if self._videoLoadStarted { if onVideoLoad != nil, self._videoLoadStarted {
var duration = Float(CMTimeGetSeconds(_playerItem.asset.duration))
if duration.isNaN || duration == 0 {
// This is a safety check for live video.
// AVPlayer report a 0 duration
duration = RCTVideoUtils.calculateSeekableDuration(_player).floatValue
if duration.isNaN {
duration = 0
}
}
var width: Float = 0
var height: Float = 0
var orientation = "undefined"
let tracks = await RCTVideoAssetsUtils.getTracks(asset: _playerItem.asset, withMediaType: .video)
if let videoTrack = tracks?.first {
width = Float(videoTrack.naturalSize.width)
height = Float(videoTrack.naturalSize.height)
} else if _playerItem.presentationSize.height != 0.0 {
width = Float(_playerItem.presentationSize.width)
height = Float(_playerItem.presentationSize.height)
}
orientation = width > height ? "landscape" : width == height ? "square" : "portrait"
let audioTracks = await RCTVideoUtils.getAudioTrackInfo(self._player) let audioTracks = await RCTVideoUtils.getAudioTrackInfo(self._player)
let textTracks = await RCTVideoUtils.getTextTrackInfo(self._player) let textTracks = await RCTVideoUtils.getTextTrackInfo(self._player)
self.onVideoLoad?(["duration": NSNumber(value: duration), self.onVideoLoad?(["duration": NSNumber(value: duration),
@ -1463,7 +1470,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
} }
func handleVolumeChange(player: AVPlayer, change: NSKeyValueObservedChange<Float>) { func handleVolumeChange(player: AVPlayer, change: NSKeyValueObservedChange<Float>) {
guard let _player else { return } guard let _player, onVolumeChange != nil else { return }
if player.rate == change.oldValue && change.oldValue != nil { if player.rate == change.oldValue && change.oldValue != nil {
return return
@ -1475,7 +1482,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
func handleExternalPlaybackActiveChange(player _: AVPlayer, change _: NSKeyValueObservedChange<Bool>) { func handleExternalPlaybackActiveChange(player _: AVPlayer, change _: NSKeyValueObservedChange<Bool>) {
#if !os(visionOS) #if !os(visionOS)
guard let _player else { return } guard let _player, onVideoExternalPlaybackChange != nil else { return }
onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive), onVideoExternalPlaybackChange?(["isExternalPlaybackActive": NSNumber(value: _player.isExternalPlaybackActive),
"target": reactTag as Any]) "target": reactTag as Any])
#endif #endif
@ -1514,6 +1521,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc @objc
func handleDidFailToFinishPlaying(notification: NSNotification!) { func handleDidFailToFinishPlaying(notification: NSNotification!) {
guard onVideoError != nil else { return }
let error: NSError! = notification.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? NSError let error: NSError! = notification.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? NSError
onVideoError?( onVideoError?(
[ [
@ -1563,6 +1572,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc @objc
func handleAVPlayerAccess(notification: NSNotification!) { func handleAVPlayerAccess(notification: NSNotification!) {
guard onVideoBandwidthUpdate != nil else { return } guard onVideoBandwidthUpdate != nil else { return }
guard let accessLog = (notification.object as? AVPlayerItem)?.accessLog() else { guard let accessLog = (notification.object as? AVPlayerItem)?.accessLog() else {
return return
} }
@ -1572,16 +1582,24 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
} }
func handleTracksChange(playerItem _: AVPlayerItem, change _: NSKeyValueObservedChange<[AVPlayerItemTrack]>) { func handleTracksChange(playerItem _: AVPlayerItem, change _: NSKeyValueObservedChange<[AVPlayerItemTrack]>) {
if onTextTracks != nil {
Task {
let textTracks = await RCTVideoUtils.getTextTrackInfo(self._player)
self.onTextTracks?(["textTracks": self._textTracks?.compactMap { $0.json } ?? textTracks.compactMap(\.json)])
}
}
if onAudioTracks != nil {
Task { Task {
let audioTracks = await RCTVideoUtils.getAudioTrackInfo(self._player) let audioTracks = await RCTVideoUtils.getAudioTrackInfo(self._player)
let textTracks = await RCTVideoUtils.getTextTrackInfo(self._player)
self.onTextTracks?(["textTracks": self._textTracks?.compactMap { $0.json } ?? textTracks.compactMap(\.json)])
self.onAudioTracks?(["audioTracks": audioTracks]) self.onAudioTracks?(["audioTracks": audioTracks])
} }
} }
}
func handleLegibleOutput(strings: [NSAttributedString]) { func handleLegibleOutput(strings: [NSAttributedString]) {
guard onTextTrackDataChanged != nil else { return }
if let subtitles = strings.first { if let subtitles = strings.first {
self.onTextTrackDataChanged?(["subtitleTracks": subtitles.string]) self.onTextTrackDataChanged?(["subtitleTracks": subtitles.string])
} }