Improve performance and add statistics for MPV

This commit is contained in:
Arkadiusz Fal
2022-06-17 12:27:01 +02:00
parent 5dea9907d9
commit d3ef6806b4
7 changed files with 86 additions and 33 deletions

View File

@@ -6,7 +6,7 @@ import Logging
import SwiftUI
final class MPVBackend: PlayerBackend {
static var clientUpdatesInterval = 1.0
static var controlsUpdateInterval = 0.5
private var logger = Logger(label: "mpv-backend")
@@ -72,11 +72,19 @@ final class MPVBackend: PlayerBackend {
client?.frameDropCount ?? 0
}
var outputFps: Double {
client?.outputFps ?? 0
}
var hwDecoder: String {
client?.hwDecoder ?? "unknown"
}
init(model: PlayerModel, controls: PlayerControlsModel? = nil) {
self.model = model
self.controls = controls
clientTimer = .init(timeInterval: Self.clientUpdatesInterval)
clientTimer = .init(timeInterval: Self.controlsUpdateInterval)
clientTimer.eventHandler = getClientUpdates
}
@@ -341,8 +349,6 @@ final class MPVBackend: PlayerBackend {
}
func handle(_ event: UnsafePointer<mpv_event>!) {
logger.info("\(String(cString: mpv_event_name(event.pointee.event_id)))")
switch event.pointee.event_id {
case MPV_EVENT_SHUTDOWN:
mpv_destroy(client.mpv)
@@ -350,7 +356,7 @@ final class MPVBackend: PlayerBackend {
case MPV_EVENT_LOG_MESSAGE:
let logmsg = UnsafeMutablePointer<mpv_event_log_message>(OpaquePointer(event.pointee.data))
logger.info(.init(stringLiteral: "log: \(String(cString: (logmsg!.pointee.prefix)!)), "
logger.info(.init(stringLiteral: "\(String(cString: (logmsg!.pointee.prefix)!)), "
+ "\(String(cString: (logmsg!.pointee.level)!)), "
+ "\(String(cString: (logmsg!.pointee.text)!))"))
@@ -375,7 +381,7 @@ final class MPVBackend: PlayerBackend {
}
default:
logger.info(.init(stringLiteral: "event: \(String(cString: mpv_event_name(event.pointee.event_id)))"))
logger.info(.init(stringLiteral: "UNHANDLED event: \(String(cString: mpv_event_name(event.pointee.event_id)))"))
}
}

View File

@@ -35,15 +35,17 @@ final class MPVClient: ObservableObject {
exit(1)
}
checkError(mpv_request_log_messages(mpv, "warn"))
#if DEBUG
checkError(mpv_request_log_messages(mpv, "debug"))
#else
checkError(mpv_request_log_messages(mpv, "warn"))
#endif
#if os(macOS)
checkError(mpv_set_option_string(mpv, "input-media-keys", "yes"))
#else
checkError(mpv_set_option_string(mpv, "hwdec", "yes"))
checkError(mpv_set_option_string(mpv, "override-display-fps", "\(UIScreen.main.maximumFramesPerSecond)"))
checkError(mpv_set_option_string(mpv, "video-sync", "display-resample"))
#endif
checkError(mpv_set_option_string(mpv, "hwdec", "auto-safe"))
checkError(mpv_set_option_string(mpv, "vo", "libmpv"))
checkError(mpv_initialize(mpv))
@@ -55,7 +57,7 @@ final class MPVClient: ObservableObject {
extra_exts: nil
)
queue = DispatchQueue(label: "mpv", qos: .background)
queue = DispatchQueue(label: "mpv", qos: .userInteractive)
withUnsafeMutablePointer(to: &initParams) { initParams in
var params = [
@@ -145,6 +147,14 @@ final class MPVClient: ObservableObject {
mpv.isNil ? 0 : getInt("frame-drop-count")
}
var outputFps: Double {
mpv.isNil ? 0.0 : getDouble("estimated-vf-fps")
}
var hwDecoder: String {
mpv.isNil ? "unknown" : (getString("hwdec-current") ?? "unknown")
}
var duration: CMTime {
CMTime.secondsInDefaultTimescale(mpv.isNil ? -1 : getDouble("duration"))
}
@@ -324,11 +334,11 @@ final class MPVClient: ObservableObject {
private func glUpdate(_ ctx: UnsafeMutableRawPointer?) {
let glView = unsafeBitCast(ctx, to: MPVOGLView.self)
glView.queue.async {
guard glView.needsDrawing else {
return
}
guard glView.needsDrawing else {
return
}
glView.queue.async {
glView.display()
}
}

View File

@@ -561,6 +561,10 @@ final class PlayerModel: ObservableObject {
controls.playingFullscreen = !isFullScreen
#if os(iOS)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
self?.setNeedsDrawing(true)
}
if controls.playingFullscreen {
guard !(UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape ?? true) else {
return
@@ -569,10 +573,6 @@ final class PlayerModel: ObservableObject {
} else {
Orientation.lockOrientation(.allButUpsideDown, andRotateTo: .portrait)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in
self?.setNeedsDrawing(true)
}
#endif
}