Skip to content

Commit 43f0285

Browse files
author
Isaac
committed
Video improvements
1 parent d45e58e commit 43f0285

File tree

8 files changed

+92
-23
lines changed

8 files changed

+92
-23
lines changed

submodules/AccountContext/Sources/UniversalVideoNode.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public protocol UniversalVideoContentNode: AnyObject {
3737
func setBaseRate(_ baseRate: Double)
3838
func setVideoQuality(_ videoQuality: UniversalVideoContentVideoQuality)
3939
func videoQualityState() -> (current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?
40+
func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError>
4041
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int
4142
func removePlaybackCompleted(_ index: Int)
4243
func fetchControl(_ control: UniversalVideoNodeFetchControl)
@@ -367,6 +368,16 @@ public final class UniversalVideoNode: ASDisplayNode {
367368
return result
368369
}
369370

371+
public func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
372+
var result: Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError>?
373+
self.manager.withUniversalVideoContent(id: self.content.id, { contentNode in
374+
if let contentNode {
375+
result = contentNode.videoQualityStateSignal()
376+
}
377+
})
378+
return result ?? .single(nil)
379+
}
380+
370381
public func continuePlayingWithoutSound(actionAtEnd: MediaPlayerPlayOnceWithSoundActionAtEnd = .loopDisablingSound) {
371382
self.manager.withUniversalVideoContent(id: self.content.id, { contentNode in
372383
if let contentNode = contentNode {

submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -678,10 +678,11 @@ final class SettingsHeaderButton: HighlightableButtonNode {
678678
} else if let speedBadge = self.speedBadge {
679679
self.speedBadge = nil
680680
if let speedBadgeView = speedBadge.view {
681-
transition.setAlpha(layer: speedBadgeView.layer, alpha: 0.0, completion: { [weak speedBadgeView] _ in
682-
speedBadgeView?.layer.removeFromSuperlayer()
681+
let speedBadgeLayer = speedBadgeView.layer
682+
transition.setAlpha(layer: speedBadgeLayer, alpha: 0.0, completion: { [weak speedBadgeLayer] _ in
683+
speedBadgeLayer?.removeFromSuperlayer()
683684
})
684-
transition.setScale(layer: speedBadgeView.layer, scale: 0.001)
685+
transition.setScale(layer: speedBadgeLayer, scale: 0.001)
685686
}
686687
}
687688

@@ -719,10 +720,11 @@ final class SettingsHeaderButton: HighlightableButtonNode {
719720
} else if let qualityBadge = self.qualityBadge {
720721
self.qualityBadge = nil
721722
if let qualityBadgeView = qualityBadge.view {
722-
transition.setAlpha(layer: qualityBadgeView.layer, alpha: 0.0, completion: { [weak qualityBadgeView] _ in
723-
qualityBadgeView?.layer.removeFromSuperlayer()
723+
let qualityBadgeLayer = qualityBadgeView.layer
724+
transition.setAlpha(layer: qualityBadgeLayer, alpha: 0.0, completion: { [weak qualityBadgeLayer] _ in
725+
qualityBadgeLayer?.removeFromSuperlayer()
724726
})
725-
transition.setScale(layer: qualityBadgeView.layer, scale: 0.001)
727+
transition.setScale(layer: qualityBadgeLayer, scale: 0.001)
726728
}
727729
}
728730
}
@@ -1888,7 +1890,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
18881890
}
18891891

18901892
var rateString: String?
1891-
if abs(playbackRate - 1.0) > 0.1 {
1893+
if abs(playbackRate - 1.0) > 0.05 {
18921894
var stringValue = String(format: "%.1fx", playbackRate)
18931895
if stringValue.hasSuffix(".0x") {
18941896
stringValue = stringValue.replacingOccurrences(of: ".0x", with: "x")
@@ -3284,9 +3286,9 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
32843286

32853287
let contextController = ContextController(presentationData: self.presentationData.withUpdated(theme: defaultDarkColorPresentationTheme), source: .reference(HeaderContextReferenceContentSource(controller: controller, sourceNode: sourceNode)), items: items |> map { items in
32863288
if !items.topItems.isEmpty {
3287-
return ContextController.Items(content: .twoLists(items.items, items.topItems))
3289+
return ContextController.Items(id: AnyHashable(0), content: .twoLists(items.items, items.topItems))
32883290
} else {
3289-
return ContextController.Items(content: .list(items.items))
3291+
return ContextController.Items(id: AnyHashable(0), content: .list(items.items))
32903292
}
32913293
}, gesture: gesture)
32923294
if isSettings {
@@ -3459,9 +3461,12 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
34593461
peer = .single(nil)
34603462
}
34613463

3462-
return combineLatest(queue: Queue.mainQueue(), videoNode.status, peer)
3463-
|> take(1)
3464-
|> map { [weak self] status, peer -> (items: [ContextMenuItem], topItems: [ContextMenuItem]) in
3464+
return combineLatest(queue: Queue.mainQueue(),
3465+
videoNode.status |> take(1),
3466+
peer,
3467+
videoNode.videoQualityStateSignal()
3468+
)
3469+
|> map { [weak self] status, peer, videoQualityState -> (items: [ContextMenuItem], topItems: [ContextMenuItem]) in
34653470
guard let status = status, let strongSelf = self else {
34663471
return ([], [])
34673472
}
@@ -3483,7 +3488,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
34833488
sliderValuePromise.set(newValue)
34843489
}), true))
34853490

3486-
if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty {
3491+
if let videoQualityState, !videoQualityState.available.isEmpty {
34873492
} else {
34883493
items.append(.custom(SectionTitleContextItem(text: strongSelf.presentationData.strings.Gallery_VideoSettings_SpeedSectionTitle), false))
34893494
for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) {
@@ -3510,7 +3515,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
35103515
}
35113516
}
35123517

3513-
if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty {
3518+
if let videoQualityState, !videoQualityState.available.isEmpty {
35143519
items.append(.custom(SectionTitleContextItem(text: strongSelf.presentationData.strings.Gallery_VideoSettings_QualitySectionTitle), false))
35153520

35163521
do {
@@ -3522,7 +3527,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
35223527
} else {
35233528
textLayout = .singleLine
35243529
}
3525-
items.append(.action(ContextMenuActionItem(text: qualityText, textLayout: textLayout, icon: { _ in
3530+
items.append(.action(ContextMenuActionItem(id: AnyHashable("q"), text: qualityText, textLayout: textLayout, icon: { _ in
35263531
if isSelected {
35273532
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: .white)
35283533
} else {
@@ -3536,10 +3541,6 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
35363541
}
35373542
videoNode.setVideoQuality(.auto)
35383543
self.videoQualityPromise.set(.auto)
3539-
3540-
/*if let controller = strongSelf.galleryController() as? GalleryController {
3541-
controller.updateSharedPlaybackRate(rate)
3542-
}*/
35433544
})))
35443545
}
35453546

submodules/TelegramUI/Components/RasterizedCompositionComponent/Sources/RasterizedCompositionComponent.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public final class RasterizedCompositionMonochromeLayer: SimpleLayer {
261261
override public init() {
262262
super.init()
263263

264-
self.maskedLayer.isHidden = true
264+
self.maskedLayer.opacity = 0.0
265265
self.addSublayer(self.maskedLayer)
266266

267267
self.maskedLayer.mask = self.contentsLayer
@@ -377,9 +377,9 @@ public final class RasterizedCompositionMonochromeLayer: SimpleLayer {
377377
}
378378

379379
private func updateRasterizationMode() {
380-
self.maskedLayer.isHidden = !self.contentsLayer.hasAnimationsInTree
381-
if self.rasterizedLayer.isHidden != (!self.maskedLayer.isHidden) {
382-
self.rasterizedLayer.isHidden = (!self.maskedLayer.isHidden)
380+
self.maskedLayer.opacity = self.contentsLayer.hasAnimationsInTree ? 1.0 : 0.0
381+
if self.rasterizedLayer.isHidden != (self.maskedLayer.opacity != 0.0) {
382+
self.rasterizedLayer.isHidden = self.maskedLayer.opacity != 0.0
383383
if !self.rasterizedLayer.isHidden {
384384
self.updateContents()
385385
}

submodules/TelegramUniversalVideoContent/Sources/HLSVideoJSNativeContentNode.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,18 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
978978
}
979979
}
980980

981+
private struct VideoQualityState: Equatable {
982+
var current: Int
983+
var preferred: UniversalVideoContentVideoQuality
984+
var available: [Int]
985+
986+
init(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int]) {
987+
self.current = current
988+
self.preferred = preferred
989+
self.available = available
990+
}
991+
}
992+
981993
fileprivate static var sharedBandwidthEstimate: Double?
982994

983995
private let postbox: Postbox
@@ -1047,8 +1059,12 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
10471059
fileprivate var playerRate: Double = 0.0
10481060
fileprivate var playerDefaultRate: Double = 1.0
10491061
fileprivate var playerTime: Double = 0.0
1062+
10501063
fileprivate var playerAvailableLevels: [Int: Level] = [:]
10511064
fileprivate var playerCurrentLevelIndex: Int?
1065+
1066+
private var videoQualityStateValue: VideoQualityState?
1067+
private let videoQualityStatePromise = Promise<VideoQualityState?>(nil)
10521068

10531069
private var hasRequestedPlayerLoad: Bool = false
10541070

@@ -1265,6 +1281,8 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
12651281
self.playerCurrentLevelIndex = nil
12661282
}
12671283

1284+
self.updateVideoQualityState()
1285+
12681286
if self.playerIsReady {
12691287
if !self.hasRequestedPlayerLoad {
12701288
if !self.playerAvailableLevels.isEmpty {
@@ -1566,11 +1584,24 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
15661584
}
15671585
}
15681586

1587+
self.updateVideoQualityState()
1588+
15691589
if self.playerIsReady {
15701590
SharedHLSVideoWebView.shared.webView?.evaluateJavaScript("window.hlsPlayer_instances[\(self.instanceId)].playerSetLevel(\(self.requestedLevelIndex ?? -1));", completionHandler: nil)
15711591
}
15721592
}
15731593

1594+
private func updateVideoQualityState() {
1595+
var videoQualityState: VideoQualityState?
1596+
if let value = self.videoQualityState() {
1597+
videoQualityState = VideoQualityState(current: value.current, preferred: value.preferred, available: value.available)
1598+
}
1599+
if self.videoQualityStateValue != videoQualityState {
1600+
self.videoQualityStateValue = videoQualityState
1601+
self.videoQualityStatePromise.set(.single(videoQualityState))
1602+
}
1603+
}
1604+
15741605
func videoQualityState() -> (current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])? {
15751606
if self.playerAvailableLevels.isEmpty {
15761607
if let qualitySet = HLSQualitySet(baseFile: self.fileReference), let minQualityFile = HLSVideoContent.minimizedHLSQuality(file: self.fileReference)?.file {
@@ -1594,6 +1625,16 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
15941625
return (min(currentLevel.width, currentLevel.height), self.preferredVideoQuality, available)
15951626
}
15961627

1628+
public func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
1629+
return self.videoQualityStatePromise.get()
1630+
|> map { value -> (current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])? in
1631+
guard let value else {
1632+
return nil
1633+
}
1634+
return (value.current, value.preferred, value.available)
1635+
}
1636+
}
1637+
15971638
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int {
15981639
return self.playbackCompletedListeners.add(f)
15991640
}

submodules/TelegramUniversalVideoContent/Sources/NativeVideoContent.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,10 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
667667
return nil
668668
}
669669

670+
func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
671+
return .single(nil)
672+
}
673+
670674
func continuePlayingWithoutSound(actionAtEnd: MediaPlayerPlayOnceWithSoundActionAtEnd) {
671675
assert(Queue.mainQueue().isCurrent())
672676
let action = { [weak self] in

submodules/TelegramUniversalVideoContent/Sources/PlatformVideoContent.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,10 @@ private final class PlatformVideoContentNode: ASDisplayNode, UniversalVideoConte
459459
return nil
460460
}
461461

462+
func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
463+
return .single(nil)
464+
}
465+
462466
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int {
463467
return self.playbackCompletedListeners.add(f)
464468
}

submodules/TelegramUniversalVideoContent/Sources/SystemVideoContent.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ private final class SystemVideoContentNode: ASDisplayNode, UniversalVideoContent
296296
return nil
297297
}
298298

299+
func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
300+
return .single(nil)
301+
}
302+
299303
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int {
300304
return self.playbackCompletedListeners.add(f)
301305
}

submodules/TelegramUniversalVideoContent/Sources/WebEmbedVideoContent.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoContentNode {
194194
return nil
195195
}
196196

197+
func videoQualityStateSignal() -> Signal<(current: Int, preferred: UniversalVideoContentVideoQuality, available: [Int])?, NoError> {
198+
return .single(nil)
199+
}
200+
197201
func addPlaybackCompleted(_ f: @escaping () -> Void) -> Int {
198202
return self.playbackCompletedListeners.add(f)
199203
}

0 commit comments

Comments
 (0)