summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/channel-display-priv.h2
-rw-r--r--gtk/channel-display.c9
2 files changed, 11 insertions, 0 deletions
diff --git a/gtk/channel-display-priv.h b/gtk/channel-display-priv.h
index 49f82fe..09683be 100644
--- a/gtk/channel-display-priv.h
+++ b/gtk/channel-display-priv.h
@@ -88,6 +88,8 @@ typedef struct display_stream {
GArray *drops_seqs_stats_arr;
uint32_t num_drops_seqs;
+ uint32_t playback_sync_drops_seq_len;
+
/* playback quality report to server */
gboolean report_is_active;
uint32_t report_id;
diff --git a/gtk/channel-display.c b/gtk/channel-display.c
index efb9aec..8452a2a 100644
--- a/gtk/channel-display.c
+++ b/gtk/channel-display.c
@@ -1298,6 +1298,7 @@ static void display_update_stream_report(SpiceDisplayChannel *channel, uint32_t
}
}
+#define STREAM_PLAYBACK_SYNC_DROP_SEQ_LEN_LIMIT 5
/* coroutine context */
static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
{
@@ -1334,11 +1335,14 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
mmtime - op->multi_media_time, op->multi_media_time, mmtime);
st->arrive_late_time += mmtime - op->multi_media_time;
st->num_drops_on_arive++;
+
if (!st->cur_drops_seq_stats.len) {
st->cur_drops_seq_stats.start_mm_time = op->multi_media_time;
}
st->cur_drops_seq_stats.len++;
+ st->playback_sync_drops_seq_len++;
} else {
+ CHANNEL_DEBUG(channel, "video latency: %d", latency);
spice_msg_in_ref(in);
g_queue_push_tail(st->msgq, in);
display_stream_schedule(st);
@@ -1349,9 +1353,14 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
memset(&st->cur_drops_seq_stats, 0, sizeof(st->cur_drops_seq_stats));
st->num_drops_seqs++;
}
+ st->playback_sync_drops_seq_len = 0;
}
display_update_stream_report(SPICE_DISPLAY_CHANNEL(channel), op->id,
op->multi_media_time, latency);
+ if (st->playback_sync_drops_seq_len >= STREAM_PLAYBACK_SYNC_DROP_SEQ_LEN_LIMIT) {
+ spice_session_sync_playback_latency(spice_channel_get_session(channel));
+ st->playback_sync_drops_seq_len = 0;
+ }
}
/* coroutine context */