mirror of
https://github.com/yattee/yattee.git
synced 2026-07-21 06:42:01 +00:00
Fix macOS permanent black video after player collapse/expand cycles
In separate-window mode, hide() keeps the ordered-out window's SwiftUI hierarchy alive (nilling contentViewController crashes AVKit), and its updateNSView unconditionally re-attached the shared MPVOGLView - stealing it into a window CoreAnimation never composites. The layer's silent skip-render fallback then consumed every frame flag, so video stayed black (climbing vo drops) until app restart. - Decline stealing the shared view from a visible container into a non-visible one; owner-initiated transfers bypass the guard - Only transfer to containers in visible windows or the window still tracked by ExpandedPlayerWindowManager; park the view otherwise and reclaim it when a container gains a window - Log skip-render frame consumption (rate-limited) and track render health counters (draws/skips/dropped draws) - Add a watchdog to the playback stats task that detects a stalled video output and re-attaches the view to a visible container - Don't mount player layouts during zero-size layout passes
This commit is contained in:
@@ -36,6 +36,15 @@ final class ExpandedPlayerWindowManager: NSObject {
|
||||
playerWindow != nil
|
||||
}
|
||||
|
||||
/// The live player window managed by this instance (nil after hide()).
|
||||
/// A window that exists here but isn't visible is mid-presentation or
|
||||
/// hidden for PiP — both valid homes for the shared render view, unlike a
|
||||
/// stale ordered-out window that is no longer tracked. Used by
|
||||
/// MPVContainerNSView when picking a transfer target.
|
||||
var currentPlayerWindow: NSWindow? {
|
||||
playerWindow
|
||||
}
|
||||
|
||||
private override init() {
|
||||
super.init()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user