video: switch videoplayer to use detached tasks

This commit is contained in:
William Casarin
2023-06-20 15:56:55 +02:00
parent b7b7d65612
commit 2ff12cdfa6
3 changed files with 12 additions and 13 deletions

View File

@@ -53,6 +53,7 @@ enum ImageShape {
} }
// MARK: - Image Carousel // MARK: - Image Carousel
@MainActor
struct ImageCarousel: View { struct ImageCarousel: View {
var urls: [MediaUrl] var urls: [MediaUrl]

View File

@@ -204,6 +204,7 @@ class EventCache {
return image_metadata[url.absoluteString.lowercased()] return image_metadata[url.absoluteString.lowercased()]
} }
@MainActor
func lookup_media_size(url: URL) -> CGSize? { func lookup_media_size(url: URL) -> CGSize? {
if let img_meta = lookup_img_metadata(url: url) { if let img_meta = lookup_img_metadata(url: url) {
return img_meta.meta.dim?.size return img_meta.meta.dim?.size
@@ -216,6 +217,7 @@ class EventCache {
video_meta[url.absoluteString] = meta video_meta[url.absoluteString] = meta
} }
@MainActor
func get_video_player_model(url: URL) -> VideoPlayerModel { func get_video_player_model(url: URL) -> VideoPlayerModel {
if let model = video_meta[url.absoluteString] { if let model = video_meta[url.absoluteString] {
return model return model

View File

@@ -39,6 +39,7 @@ enum VideoHandler {
case onStateChanged((VideoState) -> Void) case onStateChanged((VideoState) -> Void)
} }
@MainActor
public class VideoPlayerModel: ObservableObject { public class VideoPlayerModel: ObservableObject {
@Published var autoReplay: Bool = true @Published var autoReplay: Bool = true
@Published var muted: Bool = true @Published var muted: Bool = true
@@ -164,20 +165,11 @@ public extension VideoPlayer {
} }
} }
@available(iOS 13, *)
public extension VideoPlayer {
}
func get_video_size(player: AVPlayer) async -> CGSize? { func get_video_size(player: AVPlayer) async -> CGSize? {
let res = await withCheckedContinuation { continuation in let res = Task.detached(priority: .background) {
DispatchQueue.global().async { return player.currentImage?.size
let size = player.currentImage?.size
continuation.resume(returning: size)
}
} }
return res return await res.value
} }
func video_has_audio(player: AVPlayer) async -> Bool { func video_has_audio(player: AVPlayer) async -> Bool {
@@ -290,13 +282,16 @@ extension VideoPlayer: UIViewRepresentable {
self.videoPlayer = videoPlayer self.videoPlayer = videoPlayer
} }
@MainActor
func startObserver(uiView: VideoPlayerView) { func startObserver(uiView: VideoPlayerView) {
guard observer == nil else { return } guard observer == nil else { return }
observer = uiView.addPeriodicTimeObserver(forInterval: .init(seconds: 0.25, preferredTimescale: 60)) { [weak self, unowned uiView] time in observer = uiView.addPeriodicTimeObserver(forInterval: .init(seconds: 0.25, preferredTimescale: 60)) { [weak self, unowned uiView] time in
guard let `self` = self else { return } guard let `self` = self else { return }
self.videoPlayer.model.time = time Task { @MainActor in
self.videoPlayer.model.time = time
}
self.observerTime = time self.observerTime = time
self.updateBuffer(uiView: uiView) self.updateBuffer(uiView: uiView)
@@ -318,6 +313,7 @@ extension VideoPlayer: UIViewRepresentable {
self.observerBuffer = nil self.observerBuffer = nil
} }
@MainActor
func updateBuffer(uiView: VideoPlayerView) { func updateBuffer(uiView: VideoPlayerView) {
let bufferProgress = uiView.bufferProgress let bufferProgress = uiView.bufferProgress
guard bufferProgress != observerBuffer else { return } guard bufferProgress != observerBuffer else { return }