Merge branch 'beta'

# Conflicts:
#	submodules/MediaPlayer/Sources/ChunkMediaPlayerV2.swift
This commit is contained in:
Isaac
2024-12-24 13:26:57 +08:00
5 changed files with 23 additions and 40 deletions

View File

@@ -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
}
}

View File

@@ -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?()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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