Add dropped frames counter

This commit is contained in:
Arkadiusz Fal 2022-06-16 19:44:39 +02:00
parent 80659713f6
commit 81b8cbd5f1
5 changed files with 32 additions and 16 deletions

View File

@ -6,6 +6,8 @@ import Logging
import SwiftUI
final class MPVBackend: PlayerBackend {
static var clientUpdatesInterval = 1.0
private var logger = Logger(label: "mpv-backend")
var model: PlayerModel!
@ -66,11 +68,15 @@ final class MPVBackend: PlayerBackend {
client?.tracksCount ?? -1
}
var frameDropCount: Int {
client?.frameDropCount ?? 0
}
init(model: PlayerModel, controls: PlayerControlsModel? = nil) {
self.model = model
self.controls = controls
clientTimer = .init(timeInterval: 1)
clientTimer = .init(timeInterval: Self.clientUpdatesInterval)
clientTimer.eventHandler = getClientUpdates
}
@ -272,15 +278,15 @@ final class MPVBackend: PlayerBackend {
func closePiP(wasPlaying _: Bool) {}
func updateControls() {
guard model.presentingPlayer else {
return
}
DispatchQueue.main.async { [weak self] in
guard let self = self else {
return
}
guard self.controls.player.presentingPlayer else {
return
}
self.logger.info("updating controls")
self.controls.currentTime = self.currentTime ?? .zero
self.controls.duration = self.playerItemDuration ?? .zero

View File

@ -141,6 +141,10 @@ final class MPVClient: ObservableObject {
CMTime.secondsInDefaultTimescale(mpv.isNil ? -1 : getDouble("time-pos"))
}
var frameDropCount: Int {
mpv.isNil ? 0 : getInt("frame-drop-count")
}
var duration: CMTime {
CMTime.secondsInDefaultTimescale(mpv.isNil ? -1 : getDouble("duration"))
}
@ -320,11 +324,11 @@ final class MPVClient: ObservableObject {
private func glUpdate(_ ctx: UnsafeMutableRawPointer?) {
let glView = unsafeBitCast(ctx, to: MPVOGLView.self)
guard glView.needsDrawing else {
return
}
glView.queue.async {
guard glView.needsDrawing else {
return
}
glView.display()
}
}

View File

@ -11,8 +11,6 @@ final class PlayerControlsModel: ObservableObject {
@Published var timer: Timer?
@Published var playingFullscreen = false
private var throttle = Throttle(interval: 1)
var player: PlayerModel!
var playbackTime: String {
@ -62,6 +60,7 @@ final class PlayerControlsModel: ObservableObject {
return
}
player.backend.updateControls()
withAnimation(PlayerControls.animation) {
presentingControls = true
}
@ -147,8 +146,6 @@ final class PlayerControlsModel: ObservableObject {
}
func update() {
throttle.execute { [weak self] in
self?.player?.backend.updateControls()
}
player?.backend.updateControls()
}
}

View File

@ -554,6 +554,10 @@ final class PlayerModel: ObservableObject {
Windows.player.toggleFullScreen()
#endif
#if os(iOS)
setNeedsDrawing(false)
#endif
controls.playingFullscreen = !isFullScreen
#if os(iOS)
@ -565,6 +569,10 @@ final class PlayerModel: ObservableObject {
} else {
Orientation.lockOrientation(.allButUpsideDown, andRotateTo: .portrait)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
self?.setNeedsDrawing(true)
}
#endif
}

View File

@ -256,8 +256,9 @@ struct PlayerControls: View {
#endif
}
@ViewBuilder private var backendButton: some View {
button(player.activeBackend.label, width: 100) {
private var backendButton: some View {
let label = "\(player.activeBackend.label)\(player.activeBackend == .mpv ? " - \(player.mpvBackend.frameDropCount)" : "")"
return button(label, width: 120) {
player.saveTime {
player.changeActiveBackend(from: player.activeBackend, to: player.activeBackend.next())
model.resetTimer()