From 46d930fddffb53222741b043e4f0f5b973cae8c0 Mon Sep 17 00:00:00 2001 From: Mikhail Filimonov Date: Sat, 28 Dec 2024 11:28:40 +0400 Subject: [PATCH] -bump macos --- submodules/MediaPlayer/Package.swift | 3 +- .../MediaPlayer/Sources/MediaDataReader.swift | 87 ++++++++++++++++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/submodules/MediaPlayer/Package.swift b/submodules/MediaPlayer/Package.swift index 705498d5e9..79a112c8b1 100644 --- a/submodules/MediaPlayer/Package.swift +++ b/submodules/MediaPlayer/Package.swift @@ -44,7 +44,8 @@ let package = Package( "MediaPlayerFramePreview.swift", "VideoPlayerProxy.swift", "ChunkMediaPlayer.swift", - "ChunkMediaPlayerV2.swift" + "ChunkMediaPlayerV2.swift", + "ChunkMediaPlayerDirectFetchSourceImpl.swift" ]), ] ) diff --git a/submodules/MediaPlayer/Sources/MediaDataReader.swift b/submodules/MediaPlayer/Sources/MediaDataReader.swift index 2bb7b879d7..6c2d695a28 100644 --- a/submodules/MediaPlayer/Sources/MediaDataReader.swift +++ b/submodules/MediaPlayer/Sources/MediaDataReader.swift @@ -3,12 +3,97 @@ import AVFoundation import CoreMedia import FFMpegBinding import VideoToolbox - +import Postbox #if os(macOS) private let internal_isHardwareAv1Supported: Bool = { let value = VTIsHardwareDecodeSupported(kCMVideoCodecType_AV1) return value }() + + +public final class ChunkMediaPlayerPart { + public enum Id: Hashable { + case tempFile(path: String) + case directFile(path: String, audio: DirectStream?, video: DirectStream?) + } + + public struct DirectStream: Hashable { + public let index: Int + public let startPts: CMTime + public let endPts: CMTime + public let duration: Double + + public init(index: Int, startPts: CMTime, endPts: CMTime, duration: Double) { + self.index = index + self.startPts = startPts + self.endPts = endPts + self.duration = duration + } + } + + public enum Content { + public final class TempFile { + public let file: TempBoxFile + + public init(file: TempBoxFile) { + self.file = file + } + + deinit { + TempBox.shared.dispose(self.file) + } + } + + public final class FFMpegDirectFile { + public let path: String + public let audio: DirectStream? + public let video: DirectStream? + + public init(path: String, audio: DirectStream?, video: DirectStream?) { + self.path = path + self.audio = audio + self.video = video + } + } + + case tempFile(TempFile) + case directFile(FFMpegDirectFile) + } + + public let startTime: Double + public let endTime: Double + public let content: Content + public let clippedStartTime: Double? + public let codecName: String? + + public var id: Id { + switch self.content { + case let .tempFile(tempFile): + return .tempFile(path: tempFile.file.path) + case let .directFile(directFile): + return .directFile(path: directFile.path, audio: directFile.audio, video: directFile.video) + } + } + + public init(startTime: Double, clippedStartTime: Double? = nil, endTime: Double, content: Content, codecName: String?) { + self.startTime = startTime + self.clippedStartTime = clippedStartTime + self.endTime = endTime + self.content = content + self.codecName = codecName + } +} + +public final class ChunkMediaPlayerPartsState { + public let duration: Double? + public let parts: [ChunkMediaPlayerPart] + + public init(duration: Double?, parts: [ChunkMediaPlayerPart]) { + self.duration = duration + self.parts = parts + } +} + #endif public protocol MediaDataReader: AnyObject {