mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
Merge branch 'beta'
# Conflicts: # submodules/MediaPlayer/Sources/ChunkMediaPlayerV2.swift
This commit is contained in:
@@ -131,12 +131,10 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
private let renderSynchronizer: AVSampleBufferRenderSynchronizer
|
||||
private var videoRenderer: AVSampleBufferDisplayLayer
|
||||
private var audioRenderer: AVSampleBufferAudioRenderer?
|
||||
private weak var videoNode: MediaPlayerNode?
|
||||
|
||||
private var partsState = ChunkMediaPlayerPartsState(duration: nil, parts: [])
|
||||
private var loadedParts: [LoadedPart] = []
|
||||
private var loadedPartsMediaData: QueueLocalObject<LoadedPartsMediaData>
|
||||
private var reportedDidEnqueueVideo: Bool = false
|
||||
private var hasSound: Bool = false
|
||||
|
||||
private var statusValue: MediaPlayerStatus? {
|
||||
@@ -216,7 +214,6 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
assertionFailure()
|
||||
}
|
||||
self.videoRenderer = playerNode.videoLayer ?? AVSampleBufferDisplayLayer()
|
||||
self.videoNode = playerNode
|
||||
|
||||
switch source {
|
||||
case let .externalParts(partsState):
|
||||
@@ -748,8 +745,8 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
|
||||
videoTarget.requestMediaDataWhenReady(on: self.dataQueue.queue, using: { [weak self] in
|
||||
if let loadedPartsMediaData = loadedPartsMediaData.unsafeGet() {
|
||||
let fillResult = ChunkMediaPlayerV2.fillRendererBuffer(bufferTarget: videoTarget, loadedPartsMediaData: loadedPartsMediaData, isVideo: true)
|
||||
if fillResult.isReadyForMoreData {
|
||||
let bufferIsReadyForMoreData = ChunkMediaPlayerV2.fillRendererBuffer(bufferTarget: videoTarget, loadedPartsMediaData: loadedPartsMediaData, isVideo: true)
|
||||
if bufferIsReadyForMoreData {
|
||||
videoTarget.stopRequestingMediaData()
|
||||
Queue.mainQueue().async {
|
||||
guard let self else {
|
||||
@@ -766,12 +763,11 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
if !self.audioIsRequestingMediaData, let audioRenderer = self.audioRenderer {
|
||||
self.audioIsRequestingMediaData = true
|
||||
let loadedPartsMediaData = self.loadedPartsMediaData
|
||||
let reportedDidEnqueueVideo = self.reportedDidEnqueueVideo
|
||||
let audioTarget = audioRenderer
|
||||
audioTarget.requestMediaDataWhenReady(on: self.dataQueue.queue, using: { [weak self] in
|
||||
if let loadedPartsMediaData = loadedPartsMediaData.unsafeGet() {
|
||||
let fillResult = ChunkMediaPlayerV2.fillRendererBuffer(bufferTarget: audioTarget, loadedPartsMediaData: loadedPartsMediaData, isVideo: false)
|
||||
if fillResult.isReadyForMoreData {
|
||||
let bufferIsReadyForMoreData = ChunkMediaPlayerV2.fillRendererBuffer(bufferTarget: audioTarget, loadedPartsMediaData: loadedPartsMediaData, isVideo: false)
|
||||
if bufferIsReadyForMoreData {
|
||||
audioTarget.stopRequestingMediaData()
|
||||
Queue.mainQueue().async {
|
||||
guard let self else {
|
||||
@@ -781,28 +777,13 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
self.updateInternalState()
|
||||
}
|
||||
}
|
||||
if fillResult.didEnqueue && !reportedDidEnqueueVideo {
|
||||
Queue.mainQueue().async {
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
self.reportedDidEnqueueVideo = true
|
||||
if #available(iOS 17.4, *) {
|
||||
} else {
|
||||
if let videoNode = self.videoNode {
|
||||
videoNode.notifyHasSentFramesToDisplay()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private static func fillRendererBuffer(bufferTarget: AVQueuedSampleBufferRendering, loadedPartsMediaData: LoadedPartsMediaData, isVideo: Bool) -> (isReadyForMoreData: Bool, didEnqueue: Bool) {
|
||||
private static func fillRendererBuffer(bufferTarget: AVQueuedSampleBufferRendering, loadedPartsMediaData: LoadedPartsMediaData, isVideo: Bool) -> Bool {
|
||||
var bufferIsReadyForMoreData = true
|
||||
var didEnqeue = false
|
||||
outer: while true {
|
||||
if !bufferTarget.isReadyForMoreMediaData {
|
||||
bufferIsReadyForMoreData = false
|
||||
@@ -845,7 +826,6 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
/*if !isVideo {
|
||||
print("Enqueue audio \(CMSampleBufferGetPresentationTimeStamp(sampleBuffer).value) next: \(CMSampleBufferGetPresentationTimeStamp(sampleBuffer).value + 1024)")
|
||||
}*/
|
||||
didEnqeue = true
|
||||
bufferTarget.enqueue(sampleBuffer)
|
||||
hasData = true
|
||||
continue outer
|
||||
@@ -858,7 +838,7 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
|
||||
}
|
||||
}
|
||||
|
||||
return (bufferIsReadyForMoreData, didEnqeue)
|
||||
return bufferIsReadyForMoreData
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -444,11 +444,4 @@ public final class MediaPlayerNode: ASDisplayNode {
|
||||
}
|
||||
self.updateVideoInHierarchy?(self.videoInHierarchy || self.canPlaybackWithoutHierarchy)
|
||||
}
|
||||
|
||||
func notifyHasSentFramesToDisplay() {
|
||||
if !self.didNotifyVideoLayerReadyForDisplay {
|
||||
self.didNotifyVideoLayerReadyForDisplay = true
|
||||
self.hasSentFramesToDisplay?()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,8 +27,15 @@ public struct HLSCodecConfiguration {
|
||||
|
||||
public extension HLSCodecConfiguration {
|
||||
init(context: AccountContext) {
|
||||
var isHardwareAv1Supported = internal_isHardwareAv1Supported
|
||||
var isSoftwareAv1Supported = false
|
||||
/*var isSoftwareAv1Supported = false
|
||||
var isHardwareAv1Supported = false
|
||||
|
||||
var length: Int = 4
|
||||
var cpuCount: UInt32 = 0
|
||||
sysctlbyname("hw.ncpu", &cpuCount, &length, nil, 0)
|
||||
if cpuCount >= 6 {
|
||||
isSoftwareAv1Supported = true
|
||||
}
|
||||
|
||||
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["ios_enable_hardware_av1"] as? Double {
|
||||
isHardwareAv1Supported = value != 0.0
|
||||
@@ -37,7 +44,9 @@ public extension HLSCodecConfiguration {
|
||||
isSoftwareAv1Supported = value != 0.0
|
||||
}
|
||||
|
||||
self.init(isHardwareAv1Supported: isHardwareAv1Supported, isSoftwareAv1Supported: isSoftwareAv1Supported)
|
||||
self.init(isHardwareAv1Supported: isHardwareAv1Supported, isSoftwareAv1Supported: isSoftwareAv1Supported)*/
|
||||
|
||||
self.init(isHardwareAv1Supported: false, isSoftwareAv1Supported: false)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1091,7 +1091,8 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
self.contextDisposable = SharedHLSVideoJSContext.shared.register(context: self)
|
||||
|
||||
self.playerNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicDimensions)
|
||||
var didProcessFramesToDisplay = false
|
||||
|
||||
/*var didProcessFramesToDisplay = false
|
||||
self.playerNode.isHidden = true
|
||||
self.playerNode.hasSentFramesToDisplay = { [weak self] in
|
||||
guard let self, !didProcessFramesToDisplay else {
|
||||
@@ -1099,7 +1100,7 @@ final class HLSVideoJSNativeContentNode: ASDisplayNode, UniversalVideoContentNod
|
||||
}
|
||||
didProcessFramesToDisplay = true
|
||||
self.playerNode.isHidden = false
|
||||
}
|
||||
}*/
|
||||
|
||||
//let thumbnailVideoReference = HLSVideoContent.minimizedHLSQuality(file: fileReference)?.file ?? fileReference
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
|
||||
|
||||
super.init()
|
||||
|
||||
var didProcessFramesToDisplay = false
|
||||
/*var didProcessFramesToDisplay = false
|
||||
self.playerNode.isHidden = true
|
||||
self.playerNode.hasSentFramesToDisplay = { [weak self] in
|
||||
guard let self, !didProcessFramesToDisplay else {
|
||||
@@ -462,7 +462,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
|
||||
didProcessFramesToDisplay = true
|
||||
self.playerNode.isHidden = false
|
||||
self.hasSentFramesToDisplay?()
|
||||
}
|
||||
}*/
|
||||
|
||||
if let dimensions = hintDimensions {
|
||||
self.dimensions = dimensions
|
||||
|
||||
Reference in New Issue
Block a user