Fix call video display (nativePreviewWindow and nativeVideoWindow)

This commit is contained in:
Benoit Martins 2025-09-15 15:17:56 +02:00
parent 91c6f7a311
commit d3984b4b1a
2 changed files with 38 additions and 3 deletions

View file

@ -558,6 +558,10 @@ struct CallView: View {
} }
} }
.onDisappear { .onDisappear {
coreContext.doOnCoreQueue { core in
core.nativeVideoWindow = nil
}
if callViewModel.videoDisplayed { if callViewModel.videoDisplayed {
if !callViewModel.isPaused && TelecomManager.shared.callInProgress if !callViewModel.isPaused && TelecomManager.shared.callInProgress
&& !(coreContext.pipViewModel.pipController?.isPictureInPictureActive ?? false) { && !(coreContext.pipViewModel.pipController?.isPictureInPictureActive ?? false) {
@ -585,6 +589,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.aspectRatio(callViewModel.callStatsModel.sentVideoWindow.widthFactor/callViewModel.callStatsModel.sentVideoWindow.heightFactor, contentMode: .fill) .aspectRatio(callViewModel.callStatsModel.sentVideoWindow.widthFactor/callViewModel.callStatsModel.sentVideoWindow.heightFactor, contentMode: .fill)
.frame(maxWidth: callViewModel.callStatsModel.sentVideoWindow.widthFactor * 256, .frame(maxWidth: callViewModel.callStatsModel.sentVideoWindow.widthFactor * 256,
maxHeight: callViewModel.callStatsModel.sentVideoWindow.heightFactor * 256) maxHeight: callViewModel.callStatsModel.sentVideoWindow.heightFactor * 256)
@ -703,6 +712,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.aspectRatio(callViewModel.callStatsModel.sentVideoWindow.widthFactor/callViewModel.callStatsModel.sentVideoWindow.heightFactor, contentMode: .fill) .aspectRatio(callViewModel.callStatsModel.sentVideoWindow.widthFactor/callViewModel.callStatsModel.sentVideoWindow.heightFactor, contentMode: .fill)
.frame(maxWidth: callViewModel.callStatsModel.sentVideoWindow.widthFactor * 256, .frame(maxWidth: callViewModel.callStatsModel.sentVideoWindow.widthFactor * 256,
maxHeight: callViewModel.callStatsModel.sentVideoWindow.heightFactor * 256) maxHeight: callViewModel.callStatsModel.sentVideoWindow.heightFactor * 256)
@ -897,6 +911,9 @@ struct CallView: View {
} }
} }
.onDisappear { .onDisappear {
coreContext.doOnCoreQueue { core in
core.nativeVideoWindow = nil
}
if !callViewModel.isPaused && TelecomManager.shared.callInProgress if !callViewModel.isPaused && TelecomManager.shared.callInProgress
&& !(coreContext.pipViewModel.pipController?.isPictureInPictureActive ?? false) { && !(coreContext.pipViewModel.pipController?.isPictureInPictureActive ?? false) {
// TODO: Enable PIP in 6.1 // TODO: Enable PIP in 6.1
@ -978,6 +995,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.frame(width: angleDegree == 0 ? 120*1.2 : 160*1.2, height: angleDegree == 0 ? 160*1.2 : 120*1.2) .frame(width: angleDegree == 0 ? 120*1.2 : 160*1.2, height: angleDegree == 0 ? 160*1.2 : 120*1.2)
.scaledToFill() .scaledToFill()
.clipped() .clipped()
@ -1143,6 +1165,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.frame(width: angleDegree == 0 ? 120*1.2 : 160*1.2, height: angleDegree == 0 ? 160*1.2 : 120*1.2) .frame(width: angleDegree == 0 ? 120*1.2 : 160*1.2, height: angleDegree == 0 ? 160*1.2 : 120*1.2)
.scaledToFill() .scaledToFill()
.clipped() .clipped()
@ -1362,6 +1389,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.frame( .frame(
width: 120 * ceil(maxValue / 120), width: 120 * ceil(maxValue / 120),
height: 160 * ceil(maxValue / 120) height: 160 * ceil(maxValue / 120)
@ -1598,6 +1630,11 @@ struct CallView: View {
core.nativePreviewWindow = view core.nativePreviewWindow = view
} }
} }
.onDisappear {
coreContext.doOnCoreQueue { core in
core.nativePreviewWindow = nil
}
}
.frame( .frame(
width: 160 * ceil(maxValue / 120), width: 160 * ceil(maxValue / 120),
height: 120 * ceil(maxValue / 120) height: 120 * ceil(maxValue / 120)

View file

@ -714,10 +714,8 @@ class CallViewModel: ObservableObject {
func displayMyVideo() { func displayMyVideo() {
coreContext.doOnCoreQueue { core in coreContext.doOnCoreQueue { core in
guard let call = self.currentCall else { return } guard let call = self.currentCall else { return }
let invalidStates: [Call.State] = [.Released, .End, .Error, .Idle]
guard !invalidStates.contains(call.state) else { guard call.state == .StreamsRunning else {
Log.warn("\(CallViewModel.TAG) displayMyVideo called in invalid state: \(call.state), skipping update") Log.warn("\(CallViewModel.TAG) displayMyVideo called in invalid state: \(call.state), skipping update")
return return
} }