From 7cdf8de00a573b6bdb4ec4582c87aa79b25796d3 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Mon, 18 Feb 2013 14:26:25 -0500 Subject: add stream report messages If the server & client support SPICE_DISPLAY_CAP_STREAM_REPORT, the server first sends SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT. Then, the client periodically sends SPICE_MSGC_DISPLAY_STREAM_REPORT messages that supply the server details about the current quality of the video streaming on the client side. The server analyses the report and adjust the stream parameters accordingly. --- common/client_marshallers.h | 1 + common/messages.h | 18 ++++++++++++++++++ spice-protocol | 2 +- spice.proto | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/common/client_marshallers.h b/common/client_marshallers.h index 9a2385d..85051a0 100644 --- a/common/client_marshallers.h +++ b/common/client_marshallers.h @@ -44,6 +44,7 @@ typedef struct { void (*msgc_main_agent_token)(SpiceMarshaller *m, SpiceMsgcMainAgentTokens *msg); void (*msgc_main_migrate_dst_do_seamless)(SpiceMarshaller *m, SpiceMsgcMainMigrateDstDoSeamless *msg); void (*msgc_display_init)(SpiceMarshaller *m, SpiceMsgcDisplayInit *msg); + void (*msgc_display_stream_report)(SpiceMarshaller *m, SpiceMsgcDisplayStreamReport *msg); void (*msgc_inputs_key_down)(SpiceMarshaller *m, SpiceMsgcKeyDown *msg); void (*msgc_inputs_key_up)(SpiceMarshaller *m, SpiceMsgcKeyUp *msg); void (*msgc_inputs_key_modifiers)(SpiceMarshaller *m, SpiceMsgcKeyModifiers *msg); diff --git a/common/messages.h b/common/messages.h index b145cfc..1d30b87 100644 --- a/common/messages.h +++ b/common/messages.h @@ -357,6 +357,24 @@ typedef struct SpiceMsgDisplayStreamDestroy { uint32_t id; } SpiceMsgDisplayStreamDestroy; +typedef struct SpiceMsgDisplayStreamActivateReport { + uint32_t stream_id; + uint32_t unique_id; + uint32_t max_window_size; + uint32_t timeout_ms; +} SpiceMsgDisplayStreamActivateReport; + +typedef struct SpiceMsgcDisplayStreamReport { + uint32_t stream_id; + uint32_t unique_id; + uint32_t start_frame_mm_time; + uint32_t end_frame_mm_time; + uint32_t num_frames; + uint32_t num_drops; + int32_t last_frame_delay; + uint32_t audio_delay; +} SpiceMsgcDisplayStreamReport; + typedef struct SpiceMsgCursorInit { SpicePoint16 position; uint16_t trail_length; diff --git a/spice-protocol b/spice-protocol index df6bc62..a04cc68 160000 --- a/spice-protocol +++ b/spice-protocol @@ -1 +1 @@ -Subproject commit df6bc6269ebd3144663cbdb8457fbe71d9202b6a +Subproject commit a04cc68ba16c5ad8cf1f35b61c1464ef96bdfb0c diff --git a/spice.proto b/spice.proto index 655352a..97d1e1b 100644 --- a/spice.proto +++ b/spice.proto @@ -890,6 +890,13 @@ channel DisplayChannel : BaseChannel { } data; } draw_composite; + message { + uint32 stream_id; + uint32 unique_id; + uint32 max_window_size; + uint32 timeout_ms; + } stream_activate_report; + client: message { uint8 pixmap_cache_id; @@ -897,6 +904,17 @@ channel DisplayChannel : BaseChannel { uint8 glz_dictionary_id; int32 glz_dictionary_window_size; // in pixels } init = 101; + + message { + uint32 stream_id; + uint32 unique_id; + uint32 start_frame_mm_time; + uint32 end_frame_mm_time; + uint32 num_frames; + uint32 num_drops; + int32 last_frame_delay; + uint32 audio_delay; + } stream_report; }; flags16 keyboard_modifier_flags { -- cgit v1.2.3