[feat] display video codecs and refine network statistics

This commit is contained in:
dijunkun
2026-10-22 19:18:37 +08:00
parent 193dcc4be0
commit c6a2f6a35b
15 changed files with 247 additions and 48 deletions
+7
View File
@@ -32,6 +32,7 @@ enum ControlType {
video_settings = 11,
video_settings_status = 12,
text_input = 13,
video_codec_status = 14,
};
enum MouseFlag {
@@ -138,6 +139,7 @@ struct HostInfo {
// Optional capability; absent in legacy desktop and web host information.
bool supports_privacy_screen;
bool supports_video_settings;
bool supports_video_codec_status;
bool supports_text_input;
bool supports_deskhub_preview;
bool supports_deskhub_resolution;
@@ -179,6 +181,10 @@ struct VideoSettings {
bool accepted; // Only meaningful in video_settings_status.
};
struct VideoCodecStatus {
char encoder[128];
};
inline bool ValidVideoSettings(const VideoSettings& settings) {
return settings.quality >= 0 && settings.quality <= 2 &&
(settings.frame_rate == 30 || settings.frame_rate == 60) &&
@@ -202,6 +208,7 @@ struct RemoteAction {
PrivacyCommand pc;
PrivacyStatus ps;
VideoSettings vs;
VideoCodecStatus vcs;
};
// Committed UTF-8 text. Kept outside the POD union for automatic ownership.
+16
View File
@@ -26,6 +26,7 @@ void ResetHostInfo(HostInfo& info) {
info.bottom = nullptr;
info.supports_privacy_screen = false;
info.supports_video_settings = false;
info.supports_video_codec_status = false;
info.supports_text_input = false;
info.supports_deskhub_preview = false;
info.supports_deskhub_resolution = false;
@@ -177,6 +178,9 @@ std::string RemoteAction::ToJson(const RemoteAction& action) {
{"render_mode", static_cast<int>(action.cs.render_mode)},
{"hidden_reason", static_cast<int>(action.cs.hidden_reason)}};
break;
case ControlType::video_codec_status:
object["video_codec"] = {{"encoder", action.vcs.encoder}};
break;
case ControlType::video_settings:
case ControlType::video_settings_status:
if (!ValidVideoSettings(action.vs)) return {};
@@ -232,6 +236,7 @@ std::string RemoteAction::ToJson(const RemoteAction& action) {
{"displays", displays},
{"supports_privacy_screen", action.i.supports_privacy_screen},
{"supports_video_settings", action.i.supports_video_settings},
{"supports_video_codec_status", action.i.supports_video_codec_status},
{"supports_text_input", action.i.supports_text_input},
{"supports_deskhub_preview", action.i.supports_deskhub_preview},
{"supports_deskhub_resolution", action.i.supports_deskhub_resolution},
@@ -342,6 +347,15 @@ bool RemoteAction::FromJson(const std::string& json_string,
std::clamp(output.cs.visual_offset_y, -1.0f, 1.0f);
break;
}
case ControlType::video_codec_status: {
const auto encoder = object.at("video_codec").at("encoder").get<std::string>();
if (encoder.size() >= sizeof(output.vcs.encoder) ||
std::any_of(encoder.begin(), encoder.end(), [](unsigned char c) {
return c < 32 || c > 126;
})) return false;
std::memcpy(output.vcs.encoder, encoder.c_str(), encoder.size() + 1);
break;
}
case ControlType::video_settings:
case ControlType::video_settings_status: {
const auto& settings = object.at("video_settings");
@@ -436,6 +450,8 @@ bool RemoteAction::FromJson(const std::string& json_string,
host_info_object.value("supports_text_input", false);
output.i.supports_video_settings =
host_info_object.value("supports_video_settings", false);
output.i.supports_video_codec_status =
host_info_object.value("supports_video_codec_status", false);
output.i.supports_deskhub_preview =
host_info_object.value("supports_deskhub_preview", false);
output.i.supports_deskhub_resolution =