mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice-gtk
synced 2026-01-05 19:35:33 +00:00
channel-display: The video latency is in fact a margin
'Latency' is confusing because it evokes either the network latency or the audio latency, neither of which match what the latency variables contain. Instead they record how much margin there was between when the frame was received, and when it is supposed to be displayed. Hence the new name. Signed-off-by: Francois Gouget <fgouget@codeweavers.com> Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
dc23171f88
commit
887aedff41
@ -679,7 +679,7 @@ static void spice_gst_decoder_destroy(VideoDecoder *video_decoder)
|
||||
* spice_frame_free() and free its encoded_frame.
|
||||
*/
|
||||
static gboolean spice_gst_decoder_queue_frame(VideoDecoder *video_decoder,
|
||||
SpiceFrame *frame, int latency)
|
||||
SpiceFrame *frame, int margin)
|
||||
{
|
||||
SpiceGstDecoder *decoder = (SpiceGstDecoder*)video_decoder;
|
||||
|
||||
@ -697,7 +697,7 @@ static gboolean spice_gst_decoder_queue_frame(VideoDecoder *video_decoder,
|
||||
}
|
||||
decoder->last_mm_time = frame->mm_time;
|
||||
|
||||
if (latency < 0 &&
|
||||
if (margin < 0 &&
|
||||
decoder->base.codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG) {
|
||||
/* Dropping MJPEG frames has no impact on those that follow and
|
||||
* saves CPU so do it.
|
||||
@ -726,7 +726,7 @@ static gboolean spice_gst_decoder_queue_frame(VideoDecoder *video_decoder,
|
||||
frame->data, frame->size, 0, frame->size,
|
||||
frame, (GDestroyNotify) spice_frame_free);
|
||||
|
||||
GstClockTime pts = gst_clock_get_time(decoder->clock) - gst_element_get_base_time(decoder->pipeline) + ((uint64_t)MAX(0, latency)) * 1000 * 1000;
|
||||
GstClockTime pts = gst_clock_get_time(decoder->clock) - gst_element_get_base_time(decoder->pipeline) + ((uint64_t)MAX(0, margin)) * 1000 * 1000;
|
||||
GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE;
|
||||
GST_BUFFER_DTS(buffer) = GST_CLOCK_TIME_NONE;
|
||||
GST_BUFFER_PTS(buffer) = pts;
|
||||
|
||||
@ -219,7 +219,7 @@ static void mjpeg_decoder_drop_queue(MJpegDecoder *decoder)
|
||||
/* ---------- VideoDecoder's public API ---------- */
|
||||
|
||||
static gboolean mjpeg_decoder_queue_frame(VideoDecoder *video_decoder,
|
||||
SpiceFrame *frame, int32_t latency)
|
||||
SpiceFrame *frame, int32_t margin)
|
||||
{
|
||||
MJpegDecoder *decoder = (MJpegDecoder*)video_decoder;
|
||||
SpiceFrame *last_frame;
|
||||
@ -239,7 +239,7 @@ static gboolean mjpeg_decoder_queue_frame(VideoDecoder *video_decoder,
|
||||
/* Dropped MJPEG frames don't impact the ones that come after.
|
||||
* So drop late frames as early as possible to save on processing time.
|
||||
*/
|
||||
if (latency < 0) {
|
||||
if (margin < 0) {
|
||||
SPICE_DEBUG("dropping a late MJPEG frame");
|
||||
spice_frame_free(frame);
|
||||
return TRUE;
|
||||
|
||||
@ -1432,7 +1432,7 @@ gboolean hand_pipeline_to_widget(display_stream *st, GstPipeline *pipeline)
|
||||
#define STREAM_REPORT_DROP_SEQ_LEN_LIMIT 3
|
||||
|
||||
static void display_update_stream_report(SpiceDisplayChannel *channel, uint32_t stream_id,
|
||||
uint32_t frame_time, int32_t latency)
|
||||
uint32_t frame_time, int32_t margin)
|
||||
{
|
||||
display_stream *st = get_stream_by_id(SPICE_CHANNEL(channel), stream_id);
|
||||
guint64 now;
|
||||
@ -1449,7 +1449,7 @@ static void display_update_stream_report(SpiceDisplayChannel *channel, uint32_t
|
||||
}
|
||||
st->report_num_frames++;
|
||||
|
||||
if (latency < 0) { // drop
|
||||
if (margin < 0) { // drop
|
||||
st->report_num_drops++;
|
||||
st->report_drops_seq_len++;
|
||||
} else {
|
||||
@ -1469,7 +1469,7 @@ static void display_update_stream_report(SpiceDisplayChannel *channel, uint32_t
|
||||
report.end_frame_mm_time = frame_time;
|
||||
report.num_frames = st->report_num_frames;
|
||||
report.num_drops = st-> report_num_drops;
|
||||
report.last_frame_delay = latency;
|
||||
report.last_frame_delay = margin;
|
||||
if (spice_session_is_playback_active(session)) {
|
||||
report.audio_delay = spice_session_get_playback_latency(session);
|
||||
} else {
|
||||
@ -1606,14 +1606,14 @@ static void display_stream_stats_save(display_stream *st,
|
||||
guint32 server_mmtime,
|
||||
guint32 client_mmtime)
|
||||
{
|
||||
gint32 latency = server_mmtime - client_mmtime;
|
||||
gint32 margin = server_mmtime - client_mmtime;
|
||||
|
||||
if (!st->num_input_frames) {
|
||||
st->first_frame_mm_time = server_mmtime;
|
||||
}
|
||||
st->num_input_frames++;
|
||||
|
||||
if (latency < 0) {
|
||||
if (margin < 0) {
|
||||
CHANNEL_DEBUG(st->channel, "stream data too late by %u ms (ts: %u, mmtime: %u)",
|
||||
client_mmtime - server_mmtime, server_mmtime, client_mmtime);
|
||||
st->arrive_late_time += client_mmtime - server_mmtime;
|
||||
@ -1630,7 +1630,7 @@ static void display_stream_stats_save(display_stream *st,
|
||||
return;
|
||||
}
|
||||
|
||||
CHANNEL_DEBUG(st->channel, "video latency: %d", latency);
|
||||
CHANNEL_DEBUG(st->channel, "video margin: %d", margin);
|
||||
if (st->cur_drops_seq_stats.len) {
|
||||
st->cur_drops_seq_stats.duration = server_mmtime -
|
||||
st->cur_drops_seq_stats.start_mm_time;
|
||||
@ -1679,7 +1679,7 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
|
||||
SpiceStreamDataHeader *op = spice_msg_in_parsed(in);
|
||||
display_stream *st = get_stream_by_id(channel, op->id);
|
||||
guint32 mmtime;
|
||||
int32_t latency, latency_report;
|
||||
int32_t margin, margin_report;
|
||||
SpiceFrame *frame;
|
||||
|
||||
g_return_if_fail(st != NULL);
|
||||
@ -1694,13 +1694,13 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
|
||||
op->multi_media_time = mmtime + 100; /* workaround... */
|
||||
}
|
||||
|
||||
latency = latency_report = op->multi_media_time - mmtime;
|
||||
if (latency > 0) {
|
||||
margin = margin_report = op->multi_media_time - mmtime;
|
||||
if (margin > 0) {
|
||||
SpiceSession *s = spice_channel_get_session(channel);
|
||||
|
||||
if (st->surface->streaming_mode && !spice_session_is_playback_active(s)) {
|
||||
CHANNEL_DEBUG(channel, "video latency: %d, set to 0 since there is no playback", latency);
|
||||
latency = 0;
|
||||
CHANNEL_DEBUG(channel, "video margin: %d, set to 0 since there is no playback", margin);
|
||||
margin = 0;
|
||||
}
|
||||
}
|
||||
display_stream_stats_save(st, op->multi_media_time, mmtime);
|
||||
@ -1710,7 +1710,7 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
|
||||
* taking into account the impact on later frames.
|
||||
*/
|
||||
frame = spice_frame_new(st, in, op->multi_media_time);
|
||||
if (!st->video_decoder->queue_frame(st->video_decoder, frame, latency)) {
|
||||
if (!st->video_decoder->queue_frame(st->video_decoder, frame, margin)) {
|
||||
destroy_stream(channel, op->id);
|
||||
report_invalid_stream(channel, op->id);
|
||||
return;
|
||||
@ -1718,7 +1718,7 @@ static void display_handle_stream_data(SpiceChannel *channel, SpiceMsgIn *in)
|
||||
|
||||
if (c->enable_adaptive_streaming) {
|
||||
display_update_stream_report(SPICE_DISPLAY_CHANNEL(channel), op->id,
|
||||
op->multi_media_time, latency_report);
|
||||
op->multi_media_time, margin_report);
|
||||
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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user