diff --git a/Model/Player/Backends/AVPlayerBackend.swift b/Model/Player/Backends/AVPlayerBackend.swift index bdf6fbce..53d60b5d 100644 --- a/Model/Player/Backends/AVPlayerBackend.swift +++ b/Model/Player/Backends/AVPlayerBackend.swift @@ -183,11 +183,6 @@ final class AVPlayerBackend: PlayerBackend { } #endif - func updateControls() {} - func startControlsUpdates() {} - func stopControlsUpdates() {} - func setNeedsDrawing(_: Bool) {} - private func loadSingleAsset( _ url: URL, stream: Stream, @@ -564,4 +559,10 @@ final class AVPlayerBackend: PlayerBackend { } } } + + func updateControls() {} + func startControlsUpdates() {} + func stopControlsUpdates() {} + func setNeedsDrawing(_: Bool) {} + func setSize(_: Double, _: Double) {} } diff --git a/Model/Player/Backends/MPVBackend.swift b/Model/Player/Backends/MPVBackend.swift index ac6e81b7..f9c86514 100644 --- a/Model/Player/Backends/MPVBackend.swift +++ b/Model/Player/Backends/MPVBackend.swift @@ -152,6 +152,10 @@ final class MPVBackend: PlayerBackend { isPlaying = true startClientUpdates() + if controls.presentingControls { + startControlsUpdates() + } + client?.play() } @@ -305,4 +309,8 @@ final class MPVBackend: PlayerBackend { func setNeedsDrawing(_ needsDrawing: Bool) { client?.setNeedsDrawing(needsDrawing) } + + func setSize(_ width: Double, _ height: Double) { + self.client?.setSize(width, height) + } } diff --git a/Model/Player/Backends/MPVClient.swift b/Model/Player/Backends/MPVClient.swift index 9fe51d6b..402dbe18 100644 --- a/Model/Player/Backends/MPVClient.swift +++ b/Model/Player/Backends/MPVClient.swift @@ -168,14 +168,23 @@ final class MPVClient: ObservableObject { } func setSize(_ width: Double, _ height: Double) { - logger.info("setting player size to \(width),\(height)") + let roundedWidth = width.rounded() + let roundedHeight = height.rounded() + + guard width > 0, height > 0 else { + return + } + + logger.info("setting player size to \(roundedWidth),\(roundedHeight)") #if !os(macOS) - guard width <= UIScreen.main.bounds.width, height <= UIScreen.main.bounds.height else { + guard roundedWidth <= UIScreen.main.bounds.width, roundedHeight <= UIScreen.main.bounds.height else { logger.info("requested size is greater than screen size, ignoring") + logger.info("width: \(roundedWidth) <= \(UIScreen.main.bounds.width)") + logger.info("height: \(roundedHeight) <= \(UIScreen.main.bounds.height)") return } - glView?.frame = CGRect(x: 0, y: 0, width: width, height: height) + glView?.frame = CGRect(x: 0, y: 0, width: roundedWidth, height: roundedHeight) #endif } diff --git a/Model/Player/Backends/PlayerBackend.swift b/Model/Player/Backends/PlayerBackend.swift index 2745cf5e..95a36185 100644 --- a/Model/Player/Backends/PlayerBackend.swift +++ b/Model/Player/Backends/PlayerBackend.swift @@ -50,6 +50,7 @@ protocol PlayerBackend { func stopControlsUpdates() func setNeedsDrawing(_ needsDrawing: Bool) + func setSize(_ width: Double, _ height: Double) } extension PlayerBackend { diff --git a/Model/Player/PlayerControlsModel.swift b/Model/Player/PlayerControlsModel.swift index 0cfbd8ef..626b2509 100644 --- a/Model/Player/PlayerControlsModel.swift +++ b/Model/Player/PlayerControlsModel.swift @@ -101,6 +101,10 @@ final class PlayerControlsModel: ObservableObject { } func resetTimer() { + if !presentingControls { + show() + } + removeTimer() timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in withAnimation(PlayerControls.animation) { [weak self] in diff --git a/Model/Player/PlayerModel.swift b/Model/Player/PlayerModel.swift index 1579257d..3be73d27 100644 --- a/Model/Player/PlayerModel.swift +++ b/Model/Player/PlayerModel.swift @@ -42,7 +42,9 @@ final class PlayerModel: ObservableObject { } } - @Published var playerSize: CGSize = .zero + @Published var playerSize: CGSize = .zero { didSet { + backend.setSize(playerSize.width, playerSize.height) + }} @Published var stream: Stream? @Published var currentRate: Float = 1.0 { didSet { backend.setRate(currentRate) } } diff --git a/Model/Player/PlayerTVMenu.swift b/Model/Player/PlayerTVMenu.swift index 7e003485..97535b34 100644 --- a/Model/Player/PlayerTVMenu.swift +++ b/Model/Player/PlayerTVMenu.swift @@ -66,7 +66,7 @@ extension PlayerModel { func rebuildTVMenu() { #if os(tvOS) - controller?.playerView.transportBarCustomMenuItems = [ + avPlayerBackend.controller?.playerView.transportBarCustomMenuItems = [ restoreLastSkippedSegmentAction, rateMenu, streamsMenu diff --git a/Shared/Player/MPV/MPVOGLView.swift b/Shared/Player/MPV/MPVOGLView.swift index 8fadf311..f466e548 100644 --- a/Shared/Player/MPV/MPVOGLView.swift +++ b/Shared/Player/MPV/MPVOGLView.swift @@ -1,18 +1,22 @@ import GLKit +import Logging import OpenGLES final class MPVOGLView: GLKView { + private var logger = Logger(label: "stream.yattee.mpv.oglview") private var defaultFBO: GLint? var mpvGL: UnsafeMutableRawPointer? var needsDrawing = true override init(frame: CGRect) { - guard let context = EAGLContext(api: .openGLES2) else { + guard let context = EAGLContext(api: .openGLES3) else { print("Failed to initialize OpenGLES 2.0 context") exit(1) } + logger.info("frame size: \(frame.width) x \(frame.height)") + super.init(frame: frame, context: context) contentMode = .redraw @@ -33,14 +37,17 @@ final class MPVOGLView: GLKView { glClear(UInt32(GL_COLOR_BUFFER_BIT)) } - override func draw(_ rect: CGRect) { + override func draw(_: CGRect) { glGetIntegerv(UInt32(GL_FRAMEBUFFER_BINDING), &defaultFBO!) + var dims: [GLint] = [0, 0, 0, 0] + glGetIntegerv(GLenum(GL_VIEWPORT), &dims) + if mpvGL != nil { var data = mpv_opengl_fbo( fbo: Int32(defaultFBO!), - w: Int32(rect.size.width) * Int32(contentScaleFactor), - h: Int32(rect.size.height) * Int32(contentScaleFactor), + w: Int32(dims[2]), + h: Int32(dims[3]), internal_format: 0 ) var flip: CInt = 1