fix(ios): enable PiP subtitles

This commit is contained in:
edde746
2026-05-25 04:47:55 +02:00
parent 5fa8326341
commit 6b147e2053
5 changed files with 22 additions and 4 deletions
+1 -1
View File
@@ -789,7 +789,7 @@
repositoryURL = "https://github.com/edde746/MPVKit"; repositoryURL = "https://github.com/edde746/MPVKit";
requirement = { requirement = {
kind = revision; kind = revision;
revision = 42dcc3123000361d0be54fbaec981043b77e1e05; revision = 8da57fe1d3dd82524ea4b2ef6ef8b2d692ada395;
}; };
}; };
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */
@@ -40,7 +40,7 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/edde746/MPVKit", "location" : "https://github.com/edde746/MPVKit",
"state" : { "state" : {
"revision" : "42dcc3123000361d0be54fbaec981043b77e1e05" "revision" : "8da57fe1d3dd82524ea4b2ef6ef8b2d692ada395"
} }
}, },
{ {
@@ -40,7 +40,7 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/edde746/MPVKit", "location" : "https://github.com/edde746/MPVKit",
"state" : { "state" : {
"revision" : "42dcc3123000361d0be54fbaec981043b77e1e05" "revision" : "8da57fe1d3dd82524ea4b2ef6ef8b2d692ada395"
} }
}, },
{ {
@@ -188,6 +188,7 @@ class MpvPlayerPlugin: NSObject, FlutterPlugin, FlutterStreamHandler, MpvPluginS
guard let playerCore = playerCore else { return nil } guard let playerCore = playerCore else { return nil }
guard let pip = ensurePipController() else { return nil } guard let pip = ensurePipController() else { return nil }
pendingInlineRestoreAfterPip = false pendingInlineRestoreAfterPip = false
playerCore.setPipSubtitleCompositing(true)
playerCore.isPipStarting = true playerCore.isPipStarting = true
pip.syncTimebase(currentTime: playerCore.timePos, isPlaying: !playerCore.isPaused) pip.syncTimebase(currentTime: playerCore.timePos, isPlaying: !playerCore.isPaused)
pip.invalidatePlaybackState() pip.invalidatePlaybackState()
@@ -232,6 +233,7 @@ class MpvPlayerPlugin: NSObject, FlutterPlugin, FlutterStreamHandler, MpvPluginS
/// Unified cleanup for all PiP exit paths /// Unified cleanup for all PiP exit paths
private func cleanupPip(notify: Bool, pause: Bool = false) { private func cleanupPip(notify: Bool, pause: Bool = false) {
playerCore?.setPipSubtitleCompositing(false)
playerCore?.isPipStarting = false playerCore?.isPipStarting = false
playerCore?.isPipActive = false playerCore?.isPipActive = false
isManualPipRequest = false isManualPipRequest = false
+17 -1
View File
@@ -426,6 +426,22 @@ class MpvPlayerCoreBase: NSObject {
} }
} }
/// PiP presents the AVSampleBufferDisplayLayer directly, so subtitles must
/// be composited into the video samples instead of the inline OSD layer.
func setPipSubtitleCompositing(_ enabled: Bool) {
#if os(iOS)
let value = enabled ? "yes" : "no"
setRawStringPropertyAsync("avfoundation-pip-composite-osd", value: value) { result in
if case .failure(let error) = result {
print(
"[MpvPlayerCore] Failed to set PiP subtitle compositing "
+ "to \(value): \(error.localizedDescription)"
)
}
}
#endif
}
func getPropertyAsync(_ name: String, completion: @escaping (Result<String?, Error>) -> Void) { func getPropertyAsync(_ name: String, completion: @escaping (Result<String?, Error>) -> Void) {
guard let mpv else { guard let mpv else {
completion(.success(nil)) completion(.success(nil))
@@ -611,7 +627,7 @@ class MpvPlayerCoreBase: NSObject {
private func isManagedRendererProperty(_ name: String) -> Bool { private func isManagedRendererProperty(_ name: String) -> Bool {
name == "vo" || name == "wid" || name == "gpu-api" || name == "gpu-context" name == "vo" || name == "wid" || name == "gpu-api" || name == "gpu-context"
|| name == "avfoundation-composite-osd" || name == "avfoundation-composite-osd" || name == "avfoundation-pip-composite-osd"
} }
private func updateVideoGravityIfNeeded(name: String, value: String) { private func updateVideoGravityIfNeeded(name: String, value: String) {