mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Video improvements
This commit is contained in:
@@ -978,6 +978,18 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
}
|
||||
}
|
||||
|
||||
private struct VideoQualityState: Equatable {
|
||||
var current: Int
|
||||
var preferred: UniversalVideoContentVideoQuality
|
||||
var available: [Int]
|
||||
|
||||
init(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int]) {
|
||||
self.current = current
|
||||
self.preferred = preferred
|
||||
self.available = available
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate static var sharedBandwidthEstimate: Double?
|
||||
|
||||
private let postbox: Postbox
|
||||
@@ -1047,8 +1059,12 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
fileprivate var playerRate: Double = 0.0
|
||||
fileprivate var playerDefaultRate: Double = 1.0
|
||||
fileprivate var playerTime: Double = 0.0
|
||||
|
||||
fileprivate var playerAvailableLevels: [Int: Level] = [:]
|
||||
fileprivate var playerCurrentLevelIndex: Int?
|
||||
|
||||
private var videoQualityStateValue: VideoQualityState?
|
||||
private let videoQualityStatePromise = Promise<VideoQualityState?>(nil)
|
||||
|
||||
private var hasRequestedPlayerLoad: Bool = false
|
||||
|
||||
@@ -1265,6 +1281,8 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
self.playerCurrentLevelIndex = nil
|
||||
}
|
||||
|
||||
self.updateVideoQualityState()
|
||||
|
||||
if self.playerIsReady {
|
||||
if !self.hasRequestedPlayerLoad {
|
||||
if !self.playerAvailableLevels.isEmpty {
|
||||
@@ -1566,11 +1584,24 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
}
|
||||
}
|
||||
|
||||
self.updateVideoQualityState()
|
||||
|
||||
if self.playerIsReady {
|
||||
SharedHLSVideoWebView.shared.webView?.evaluateJavaScript("window.hlsPlayer_instances[\(self.instanceId)].playerSetLevel(\(self.requestedLevelIndex ?? -1));", completionHandler: nil)
|
||||
}
|
||||
}
|
||||
|
||||
private func updateVideoQualityState() {
|
||||
var videoQualityState: VideoQualityState?
|
||||
if let value = self.videoQualityState() {
|
||||
videoQualityState = VideoQualityState(current: value.current, preferred: value.preferred, available: value.available)
|
||||
}
|
||||
if self.videoQualityStateValue != videoQualityState {
|
||||
self.videoQualityStateValue = videoQualityState
|
||||
self.videoQualityStatePromise.set(.single(videoQualityState))
|
||||
}
|
||||
}
|
||||
|
||||
func videoQualityState() -> (current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])? {
|
||||
if self.playerAvailableLevels.isEmpty {
|
||||
if let qualitySet = HLSQualitySet(baseFile: self.fileReference), let minQualityFile = HLSVideoContent.minimizedHLSQuality(file: self.fileReference)?.file {
|
||||
@@ -1594,6 +1625,16 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
return (min(currentLevel.width, currentLevel.height), self.preferredVideoQuality, available)
|
||||
}
|
||||
|
||||
public func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
|
||||
return self.videoQualityStatePromise.get()
|
||||
|> map { value -> (current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])? in
|
||||
guard let value else {
|
||||
return nil
|
||||
}
|
||||
return (value.current, value.preferred, value.available)
|
||||
}
|
||||
}
|
||||
|
||||
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int {
|
||||
return self.playbackCompletedListeners.add(f)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user