From b7e1adbec6fdd2219de396b21f04b3a5a6fbf692 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Wed, 2 Sep 2026 01:05:30 +0800 Subject: [PATCH] [feat] add video adaptation preference setting --- .../src/config_center/config_center.cpp | 37 +++++++++++++ .../desktop/src/config_center/config_center.h | 9 ++++ .../src/gui/application/gui_application.cpp | 9 ++++ .../assets/localization/localization_data.h | 8 ++- .../features/settings/settings_manager.cpp | 6 +++ apps/desktop/src/gui/runtime/gui_runtime.cpp | 17 +++++- apps/desktop/src/gui/runtime/runtime_state.h | 2 + apps/desktop/src/gui/ui/main_window.slint | 10 ++++ apps/desktop/src/gui/ui/ui_localization.h | 8 +++ .../Bridge/CrossDeskRTCBridge.h | 7 +++ .../Bridge/CrossDeskRTCBridge.mm | 25 ++++++++- apps/ios/CrossDeskMobile/ContentView.swift | 16 ++++++ .../CrossDeskMobile/RemoteSessionModel.swift | 53 +++++++++++++++++++ deps/submodules/minirtc | 2 +- 14 files changed, 203 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/config_center/config_center.cpp b/apps/desktop/src/config_center/config_center.cpp index ced799d2..7bc26b13 100644 --- a/apps/desktop/src/config_center/config_center.cpp +++ b/apps/desktop/src/config_center/config_center.cpp @@ -12,6 +12,12 @@ bool IsValidTurnModeValue(long value) { value <= static_cast(ConfigCenter::TURN_MODE::FORCE_TCP); } +bool IsValidVideoAdaptationPolicyValue(long value) { + using Policy = ConfigCenter::VIDEO_ADAPTATION_POLICY; + return value >= static_cast(Policy::FRAME_RATE_PRIORITY) && + value <= static_cast(Policy::BALANCED); +} + } // namespace ConfigCenter::ConfigCenter(const std::string& config_path) @@ -52,6 +58,18 @@ int ConfigCenter::Load() { video_frame_rate_ = static_cast(ini_.GetLongValue( section_, "video_frame_rate", static_cast(video_frame_rate_))); + const long video_adaptation_policy_value = ini_.GetLongValue( + section_, "video_adaptation_policy", + static_cast(video_adaptation_policy_)); + if (IsValidVideoAdaptationPolicyValue(video_adaptation_policy_value)) { + video_adaptation_policy_ = + static_cast(video_adaptation_policy_value); + } else { + LOG_WARN("Invalid video adaptation policy [{}], using quality priority", + video_adaptation_policy_value); + video_adaptation_policy_ = VIDEO_ADAPTATION_POLICY::QUALITY_PRIORITY; + } + video_encode_format_ = static_cast( ini_.GetLongValue(section_, "video_encode_format", static_cast(video_encode_format_))); @@ -137,6 +155,8 @@ int ConfigCenter::Save() { static_cast(video_quality_)); ini_.SetLongValue(section_, "video_frame_rate", static_cast(video_frame_rate_)); + ini_.SetLongValue(section_, "video_adaptation_policy", + static_cast(video_adaptation_policy_)); ini_.SetLongValue(section_, "video_encode_format", static_cast(video_encode_format_)); ini_.SetBoolValue(section_, "hardware_video_codec", hardware_video_codec_); @@ -205,6 +225,18 @@ int ConfigCenter::SetVideoFrameRate(VIDEO_FRAME_RATE video_frame_rate) { return 0; } +int ConfigCenter::SetVideoAdaptationPolicy( + VIDEO_ADAPTATION_POLICY policy) { + video_adaptation_policy_ = policy; + ini_.SetLongValue(section_, "video_adaptation_policy", + static_cast(video_adaptation_policy_)); + SI_Error rc = ini_.SaveFile(config_path_.c_str()); + if (rc < 0) { + return -1; + } + return 0; +} + int ConfigCenter::SetVideoEncodeFormat( VIDEO_ENCODE_FORMAT video_encode_format) { video_encode_format_ = video_encode_format; @@ -395,6 +427,11 @@ ConfigCenter::VIDEO_FRAME_RATE ConfigCenter::GetVideoFrameRate() const { return video_frame_rate_; } +ConfigCenter::VIDEO_ADAPTATION_POLICY +ConfigCenter::GetVideoAdaptationPolicy() const { + return video_adaptation_policy_; +} + ConfigCenter::VIDEO_ENCODE_FORMAT ConfigCenter::GetVideoEncodeFormat() const { return video_encode_format_; } diff --git a/apps/desktop/src/config_center/config_center.h b/apps/desktop/src/config_center/config_center.h index 920dd8d3..14c2cb08 100644 --- a/apps/desktop/src/config_center/config_center.h +++ b/apps/desktop/src/config_center/config_center.h @@ -18,6 +18,11 @@ class ConfigCenter { enum class LANGUAGE { CHINESE = 0, ENGLISH = 1, RUSSIAN = 2 }; enum class VIDEO_QUALITY { LOW = 0, MEDIUM = 1, HIGH = 2 }; enum class VIDEO_FRAME_RATE { FPS_30 = 0, FPS_60 = 1 }; + enum class VIDEO_ADAPTATION_POLICY { + FRAME_RATE_PRIORITY = 0, + QUALITY_PRIORITY = 1, + BALANCED = 2 + }; enum class VIDEO_ENCODE_FORMAT { H264 = 0, AV1 = 1 }; enum class TURN_MODE { DISABLED = 0, @@ -34,6 +39,7 @@ class ConfigCenter { int SetLanguage(LANGUAGE language); int SetVideoQuality(VIDEO_QUALITY video_quality); int SetVideoFrameRate(VIDEO_FRAME_RATE video_frame_rate); + int SetVideoAdaptationPolicy(VIDEO_ADAPTATION_POLICY policy); int SetVideoEncodeFormat(VIDEO_ENCODE_FORMAT video_encode_format); int SetHardwareVideoCodec(bool hardware_video_codec); int SetTurnMode(TURN_MODE turn_mode); @@ -53,6 +59,7 @@ class ConfigCenter { LANGUAGE GetLanguage() const; VIDEO_QUALITY GetVideoQuality() const; VIDEO_FRAME_RATE GetVideoFrameRate() const; + VIDEO_ADAPTATION_POLICY GetVideoAdaptationPolicy() const; VIDEO_ENCODE_FORMAT GetVideoEncodeFormat() const; bool IsHardwareVideoCodec() const; TURN_MODE GetTurnMode() const; @@ -81,6 +88,8 @@ class ConfigCenter { LANGUAGE language_ = LANGUAGE::CHINESE; VIDEO_QUALITY video_quality_ = VIDEO_QUALITY::HIGH; VIDEO_FRAME_RATE video_frame_rate_ = VIDEO_FRAME_RATE::FPS_60; + VIDEO_ADAPTATION_POLICY video_adaptation_policy_ = + VIDEO_ADAPTATION_POLICY::QUALITY_PRIORITY; VIDEO_ENCODE_FORMAT video_encode_format_ = VIDEO_ENCODE_FORMAT::H264; bool hardware_video_codec_ = false; TURN_MODE turn_mode_ = TURN_MODE::AUTO_UDP_TCP; diff --git a/apps/desktop/src/gui/application/gui_application.cpp b/apps/desktop/src/gui/application/gui_application.cpp index fc3764f2..d2fcdce9 100644 --- a/apps/desktop/src/gui/application/gui_application.cpp +++ b/apps/desktop/src/gui/application/gui_application.cpp @@ -1206,6 +1206,8 @@ void GuiApplication::ResetSettingsUi() { ui_->main->set_language_index(language_button_value_); ui_->main->set_video_quality_index(video_quality_button_value_); ui_->main->set_frame_rate_index(video_frame_rate_button_value_); + ui_->main->set_adaptation_policy_index( + video_adaptation_policy_button_value_); ui_->main->set_codec_index(video_encode_format_button_value_); ui_->main->set_hardware_codec_enabled(enable_hardware_video_codec_); ui_->main->set_turn_enabled(enable_turn_); @@ -2904,6 +2906,8 @@ void GuiApplication::SaveSettingsFromUi() { std::clamp(main->get_video_quality_index(), 0, 2); video_frame_rate_button_value_ = std::clamp(main->get_frame_rate_index(), 0, 1); + video_adaptation_policy_button_value_ = + std::clamp(main->get_adaptation_policy_index(), 0, 2); video_encode_format_button_value_ = std::clamp(main->get_codec_index(), 0, 1); enable_hardware_video_codec_ = main->get_hardware_codec_enabled(); enable_turn_ = main->get_turn_enabled(); @@ -2920,6 +2924,9 @@ void GuiApplication::SaveSettingsFromUi() { static_cast(video_quality_button_value_)); config_center_->SetVideoFrameRate(static_cast( video_frame_rate_button_value_)); + config_center_->SetVideoAdaptationPolicy( + static_cast( + video_adaptation_policy_button_value_)); config_center_->SetVideoEncodeFormat( static_cast( video_encode_format_button_value_)); @@ -2951,6 +2958,8 @@ void GuiApplication::SaveSettingsFromUi() { language_button_value_last_ = language_button_value_; video_quality_button_value_last_ = video_quality_button_value_; video_frame_rate_button_value_last_ = video_frame_rate_button_value_; + video_adaptation_policy_button_value_last_ = + video_adaptation_policy_button_value_; video_encode_format_button_value_last_ = video_encode_format_button_value_; enable_hardware_video_codec_last_ = enable_hardware_video_codec_; enable_turn_last_ = enable_turn_; diff --git a/apps/desktop/src/gui/assets/localization/localization_data.h b/apps/desktop/src/gui/assets/localization/localization_data.h index a3c34e7e..ea6a726c 100644 --- a/apps/desktop/src/gui/assets/localization/localization_data.h +++ b/apps/desktop/src/gui/assets/localization/localization_data.h @@ -120,9 +120,15 @@ struct TranslationRow { u8"стола") \ X(settings, u8"设置", "Settings", u8"Настройки") \ X(language, u8"语言:", "Language:", u8"Язык:") \ - X(video_quality, u8"视频质量:", "Video Quality:", u8"Качество видео:") \ + X(video_quality, u8"画面质量:", "Video Quality:", u8"Качество видео:") \ X(video_frame_rate, u8"画面采集帧率:", \ "Video Capture Frame Rate:", u8"Частота захвата видео:") \ + X(video_adaptation_policy, u8"画面偏好:", "Video Preference:", \ + u8"Режим видео:") \ + X(video_priority_frame_rate, u8"帧率优先", "Frame Rate", \ + u8"Частота кадров") \ + X(video_priority_quality, u8"画质优先", "Quality", u8"Качество") \ + X(video_priority_balanced, u8"平衡", "Balanced", u8"Баланс") \ X(video_quality_high, u8"高", "High", u8"Высокое") \ X(video_quality_medium, u8"中", "Medium", u8"Среднее") \ X(video_quality_low, u8"低", "Low", u8"Низкое") \ diff --git a/apps/desktop/src/gui/features/settings/settings_manager.cpp b/apps/desktop/src/gui/features/settings/settings_manager.cpp index 83ed7e8c..89abcdea 100644 --- a/apps/desktop/src/gui/features/settings/settings_manager.cpp +++ b/apps/desktop/src/gui/features/settings/settings_manager.cpp @@ -301,6 +301,8 @@ int SettingsManager::Load() { static_cast(owner_.config_center_->GetVideoQuality()); owner_.video_frame_rate_button_value_ = static_cast(owner_.config_center_->GetVideoFrameRate()); + owner_.video_adaptation_policy_button_value_ = + static_cast(owner_.config_center_->GetVideoAdaptationPolicy()); owner_.video_encode_format_button_value_ = static_cast(owner_.config_center_->GetVideoEncodeFormat()); owner_.enable_hardware_video_codec_ = @@ -324,6 +326,10 @@ int SettingsManager::Load() { owner_.language_button_value_last_ = owner_.language_button_value_; owner_.video_quality_button_value_last_ = owner_.video_quality_button_value_; + owner_.video_frame_rate_button_value_last_ = + owner_.video_frame_rate_button_value_; + owner_.video_adaptation_policy_button_value_last_ = + owner_.video_adaptation_policy_button_value_; owner_.video_encode_format_button_value_last_ = owner_.video_encode_format_button_value_; owner_.enable_hardware_video_codec_last_ = diff --git a/apps/desktop/src/gui/runtime/gui_runtime.cpp b/apps/desktop/src/gui/runtime/gui_runtime.cpp index 484a82d3..f832d7f7 100644 --- a/apps/desktop/src/gui/runtime/gui_runtime.cpp +++ b/apps/desktop/src/gui/runtime/gui_runtime.cpp @@ -158,8 +158,21 @@ int GuiRuntime::CreateConnectionPeer() { ConfigCenter::VIDEO_FRAME_RATE::FPS_30 ? 30 : 60; - params_.video_degradation_preference = - VideoDegradationPreference::MaintainResolution; + switch (config_center_->GetVideoAdaptationPolicy()) { + case ConfigCenter::VIDEO_ADAPTATION_POLICY::FRAME_RATE_PRIORITY: + params_.video_degradation_preference = + VideoDegradationPreference::MaintainFrameRate; + break; + case ConfigCenter::VIDEO_ADAPTATION_POLICY::BALANCED: + params_.video_degradation_preference = + VideoDegradationPreference::Balanced; + break; + case ConfigCenter::VIDEO_ADAPTATION_POLICY::QUALITY_PRIORITY: + default: + params_.video_degradation_preference = + VideoDegradationPreference::MaintainResolution; + break; + } params_.on_receive_video_buffer = nullptr; params_.on_receive_audio_buffer = PeerEventHandler::OnReceiveAudioBuffer; params_.on_receive_data_buffer = PeerEventHandler::OnReceiveDataBuffer; diff --git a/apps/desktop/src/gui/runtime/runtime_state.h b/apps/desktop/src/gui/runtime/runtime_state.h index 1340ddbc..e780fa46 100644 --- a/apps/desktop/src/gui/runtime/runtime_state.h +++ b/apps/desktop/src/gui/runtime/runtime_state.h @@ -122,6 +122,7 @@ struct UserSettingsState { int language_button_value_ = 0; int video_quality_button_value_ = 2; int video_frame_rate_button_value_ = 1; + int video_adaptation_policy_button_value_ = 1; int video_encode_format_button_value_ = 0; bool enable_hardware_video_codec_ = true; bool enable_turn_ = true; @@ -133,6 +134,7 @@ struct UserSettingsState { int language_button_value_last_ = 0; int video_quality_button_value_last_ = 0; int video_frame_rate_button_value_last_ = 0; + int video_adaptation_policy_button_value_last_ = 1; int video_encode_format_button_value_last_ = 0; bool enable_hardware_video_codec_last_ = false; bool enable_turn_last_ = true; diff --git a/apps/desktop/src/gui/ui/main_window.slint b/apps/desktop/src/gui/ui/main_window.slint index fd58bbbf..2c443484 100644 --- a/apps/desktop/src/gui/ui/main_window.slint +++ b/apps/desktop/src/gui/ui/main_window.slint @@ -39,6 +39,10 @@ export global UiStrings { in-out property language: "Language"; in-out property video-quality: "Video quality"; in-out property frame-rate: "Frame rate"; + in-out property adaptation-policy: "Video preference"; + in-out property priority-frame-rate: "Frame rate"; + in-out property priority-quality: "Quality"; + in-out property priority-balanced: "Balanced"; in-out property codec: "Video codec"; in-out property hardware-codec: "Hardware video codec"; in-out property turn-relay: "TURN relay"; @@ -234,6 +238,7 @@ export component MainWindow inherits Window { in-out property language-index: 0; in-out property video-quality-index: 2; in-out property frame-rate-index: 1; + in-out property adaptation-policy-index: 1; in-out property codec-index: 0; in-out property hardware-codec-enabled: true; in-out property turn-enabled: true; @@ -1451,6 +1456,11 @@ export component MainWindow inherits Window { Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.frame-rate; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; } CompactComboBox { x: root.compact-language ? 106px : 174px; y: 2px; enabled: !root.settings-session-active; model: ["30 fps", "60 fps"]; current-index <=> root.frame-rate-index; } } + Rectangle { + height: 30px; + Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.adaptation-policy; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; } + CompactComboBox { x: root.compact-language ? 91px : 160px; y: 2px; width: root.compact-language ? 88px : 87px; enabled: !root.settings-session-active; model: [UiStrings.priority-frame-rate, UiStrings.priority-quality, UiStrings.priority-balanced]; current-index <=> root.adaptation-policy-index; } + } Rectangle { height: 30px; Text { x: 8px; y: 3px; width: root.compact-language ? 94px : 162px; height: 24px; text: UiStrings.codec; font-size: ImGuiFontStyle.body; overflow: elide; vertical-alignment: center; } diff --git a/apps/desktop/src/gui/ui/ui_localization.h b/apps/desktop/src/gui/ui/ui_localization.h index 09dee78f..5396f421 100644 --- a/apps/desktop/src/gui/ui/ui_localization.h +++ b/apps/desktop/src/gui/ui/ui_localization.h @@ -48,6 +48,14 @@ inline int ApplyMainWindowStrings( strings.set_language(Text(localization::language[language])); strings.set_video_quality(Text(localization::video_quality[language])); strings.set_frame_rate(Text(localization::video_frame_rate[language])); + strings.set_adaptation_policy( + Text(localization::video_adaptation_policy[language])); + strings.set_priority_frame_rate( + Text(localization::video_priority_frame_rate[language])); + strings.set_priority_quality( + Text(localization::video_priority_quality[language])); + strings.set_priority_balanced( + Text(localization::video_priority_balanced[language])); strings.set_codec(Text(localization::video_encode_format[language])); strings.set_hardware_codec( Text(localization::enable_hardware_video_codec[language])); diff --git a/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.h b/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.h index 33375a50..39cb84eb 100644 --- a/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.h +++ b/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.h @@ -35,6 +35,12 @@ typedef NS_ENUM(NSInteger, CrossDeskPointerAction) { CrossDeskPointerActionMiddleUp, }; +typedef NS_ENUM(NSInteger, CrossDeskVideoAdaptationPolicy) { + CrossDeskVideoAdaptationPolicyFrameRatePriority = 0, + CrossDeskVideoAdaptationPolicyQualityPriority, + CrossDeskVideoAdaptationPolicyBalanced, +}; + @class CrossDeskRTCBridge; @protocol CrossDeskRTCBridgeDelegate @@ -96,6 +102,7 @@ typedef NS_ENUM(NSInteger, CrossDeskPointerAction) { turnPort:(NSInteger)turnPort enableSRTP:(BOOL)enableSRTP; - (void)setHardwareAccelerationEnabled:(BOOL)enabled; +- (void)setVideoAdaptationPolicy:(CrossDeskVideoAdaptationPolicy)policy; - (void)requestPresenceForRemoteIDs:(NSArray *)remoteIDs NS_SWIFT_NAME(requestPresence(remoteIDs:)); diff --git a/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.mm b/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.mm index a9a16d86..5c688d6b 100644 --- a/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.mm +++ b/apps/ios/CrossDeskMobile/Bridge/CrossDeskRTCBridge.mm @@ -72,6 +72,8 @@ struct RTCState { int turn_port = 0; bool enable_srtp = false; bool hardware_acceleration = true; + VideoDegradationPreference video_adaptation_policy = + VideoDegradationPreference::MaintainResolution; bool identity_ready = false; bool identity_recovery_attempted = false; std::string identity_with_password; @@ -334,8 +336,7 @@ Params MakeParams(const RTCState &state, const std::string &user_id, params.video_content_type = VideoContentType::ScreenContent; params.video_quality = VideoQuality::QualityHigh; params.video_frame_rate = 60; - params.video_degradation_preference = - VideoDegradationPreference::MaintainResolution; + params.video_degradation_preference = state.video_adaptation_policy; params.on_receive_video_buffer = nullptr; params.on_receive_audio_buffer = OnAudioBuffer; params.on_receive_data_buffer = OnDataBuffer; @@ -496,6 +497,26 @@ Params MakeParams(const RTCState &state, const std::string &user_id, }); } +- (void)setVideoAdaptationPolicy:(CrossDeskVideoAdaptationPolicy)policy { + dispatch_async(_rtcQueue, ^{ + switch (policy) { + case CrossDeskVideoAdaptationPolicyFrameRatePriority: + self->_state->video_adaptation_policy = + VideoDegradationPreference::MaintainFrameRate; + break; + case CrossDeskVideoAdaptationPolicyBalanced: + self->_state->video_adaptation_policy = + VideoDegradationPreference::Balanced; + break; + case CrossDeskVideoAdaptationPolicyQualityPriority: + default: + self->_state->video_adaptation_policy = + VideoDegradationPreference::MaintainResolution; + break; + } + }); +} + - (void)requestPresenceForRemoteIDs:(NSArray *)remoteIDs { NSArray *owned_ids = [remoteIDs copy]; dispatch_async(_rtcQueue, ^{ diff --git a/apps/ios/CrossDeskMobile/ContentView.swift b/apps/ios/CrossDeskMobile/ContentView.swift index bea5e37e..38f470eb 100644 --- a/apps/ios/CrossDeskMobile/ContentView.swift +++ b/apps/ios/CrossDeskMobile/ContentView.swift @@ -689,6 +689,22 @@ private struct ServerSettingsView: View { .font(.caption) .foregroundStyle(.tertiary) } + Section("画面偏好") { + Picker("偏好模式", selection: $session.videoAdaptationPolicy) { + ForEach(VideoAdaptationPolicy.allCases) { policy in + Text(policy.title).tag(policy) + } + } + .pickerStyle(.segmented) + + Text(session.videoAdaptationPolicy.detail) + .font(.footnote) + .foregroundStyle(.secondary) + + Text("修改后从下一次连接开始生效。") + .font(.caption) + .foregroundStyle(.tertiary) + } Section("服务器") { TextField("信令服务器", text: $session.signalHost) .textInputAutocapitalization(.never) diff --git a/apps/ios/CrossDeskMobile/RemoteSessionModel.swift b/apps/ios/CrossDeskMobile/RemoteSessionModel.swift index 35e6b5b5..609f8646 100644 --- a/apps/ios/CrossDeskMobile/RemoteSessionModel.swift +++ b/apps/ios/CrossDeskMobile/RemoteSessionModel.swift @@ -79,6 +79,55 @@ enum VideoCodecMode: String, CaseIterable, Identifiable { } } +enum VideoAdaptationPolicy: String, CaseIterable, Identifiable { + case frameRatePriority + case qualityPriority + case balanced + + private static let defaultsKey = "crossdesk.mobile.video-adaptation-policy" + + var id: String { rawValue } + + var title: String { + switch self { + case .frameRatePriority: return "帧率优先" + case .qualityPriority: return "画质优先" + case .balanced: return "平衡" + } + } + + var detail: String { + switch self { + case .frameRatePriority: + return "优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" + case .qualityPriority: + return "始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" + case .balanced: + return "兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" + } + } + + var bridgeValue: CrossDeskVideoAdaptationPolicy { + switch self { + case .frameRatePriority: return .frameRatePriority + case .qualityPriority: return .qualityPriority + case .balanced: return .balanced + } + } + + static var saved: VideoAdaptationPolicy { + guard let rawValue = UserDefaults.standard.string(forKey: defaultsKey), + let policy = VideoAdaptationPolicy(rawValue: rawValue) else { + return .qualityPriority + } + return policy + } + + func save() { + UserDefaults.standard.set(rawValue, forKey: Self.defaultsKey) + } +} + private struct RemoteVideoFrame { let pixelBuffer: CVPixelBuffer let encodedSize: CGSize @@ -317,6 +366,9 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe @Published var videoCodecMode = VideoCodecMode.saved { didSet { videoCodecMode.save() } } + @Published var videoAdaptationPolicy = VideoAdaptationPolicy.saved { + didSet { videoAdaptationPolicy.save() } + } @Published var remoteID = "" @Published var password = "" @Published private(set) var signalStatus = "正在连接信令服务" @@ -381,6 +433,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe return } bridge.setHardwareAccelerationEnabled(videoCodecMode == .hardware) + bridge.setVideoAdaptationPolicy(videoAdaptationPolicy.bridgeValue) bridge.configure(withSignalHost: signalHost, signalPort: signal, turnPort: turn, diff --git a/deps/submodules/minirtc b/deps/submodules/minirtc index 27a608c5..20ee462e 160000 --- a/deps/submodules/minirtc +++ b/deps/submodules/minirtc @@ -1 +1 @@ -Subproject commit 27a608c525ab1213e01a623ff73a006bff7002c4 +Subproject commit 20ee462e87d5ef32ab92900da2a307008ca3af6f