[Spice-devel] [client v3 1/6] channel-display: Minimize the stream lag by ignoring the server one

Kevin Pouget kpouget at redhat.com
Fri Jun 28 08:42:58 UTC 2019


Hello,

I looked at the patch series and tried to describe its modifications
to better understand it; you'll find below my comments. François, in
the middle of it you'll find a few nit suggestions to improve the
readability.

the patch for display_handle_stream_data() is obviously the most
complex, I'll have to get back to it, it was too complicated for my
first glance


best regards,

Kevin

---


# [client,v3,1/6] channel-display: Minimize the stream lag by ignoring
the server one

display_handle_stream_data: complex modifications.

these two aspects of the commit message are complex to understand in
the code:

> - Delay adjustments are gradual, speeding up or slowing down video
>   playback until the average margin matches the target lag.
> - Changes in the average margin are tracked (see margin_spread) to
>   avoid nudging the delay in response to minor random variations.


this function is called 4 times, it could be factorized to improve the
readability:

> spice_mmtime_diff(op->multi_media_time, st->last_frame_mm_time)


+        /* Initialize the time offset.
+         * Note that UNSET_CLIENT_TIME_OFFSET can be any value including 0
+         * which is common on low-latency LANs. But an unlikely one helps when
+         * adding a trace in this codepath.
+         */

I think s/UNSET_CLIENT_TIME_OFFSET/s->client_time_offset/ would make
more sense in this comment.


stream_get_time(stream): function modified to return the system
monotonic time instead of spice_session_get_mm_time(session), which
was the system time + session->mm_time_offset.


spice_session_mmtime2client_time: new function that (a) update
session->priv->client_time_offset, which is the offset between the
client (local) time and the packets (server) time; (b) returns the
client-adjusted packet mmtime.

The default offset (now-mmtime) is used if
- no offset is currently set
- the current offset is > +/- 1s
- the current offset is > the default offset

---

# [client,v3,2/6] playback: Use the audio timestamps for the global
mmtime conversion

this patch calls spice_session_mmtime2client_time() when audio packets
arrive, to improve the accuracy of session->mm_time_offset

---

# [client,v3,3/6] channel-display: No need to rechedule on mmtime offset
changes

this patch removes the rescheduling functions:

struct VideoDecoder::void (*reschedule)(): this function pointer was
  used to force the reschedule of a frame (= modify the timer that
  will call display_frame() at the right time)

spice_gst_decoder_reschedule(): idem
mjpeg_decoder_reschedule(): idem

display_session_mm_time_reset_cb(): handler for "mm-time-reset"
signal. This signal was used when a migration between two spice
servers with different mm-times occured. In this case,
video_decoder->reschedule() was called to reschedule the display of
the current frame.

The "mm-time-reset" signal is emitted when current_time < old_time or
current_time > old_time+MM_TIME_DIFF_RESET_THRESH (0.5 sec).

The "mm-time-reset" signal might still be relevant, although at the
moment is has no client.

---

# [client,v3,4/6] channel-display: Remove playback_sync_drops_seq_len

this patch removes "struct
display_stream::playback_sync_drops_seq_len" field and the operations
related to it:

define STREAM_PLAYBACK_SYNC_DROP_SEQ_LEN_LIMIT 5

display_stream_stats_save(): this function was counting the number of
frame dropped in sequence.

display_handle_stream_data(): if the adaptive streaming was enabled
and the count of consecutive frames dropped was above a threshold, it
called spice_session_sync_playback_latency() and reset the drop count.

spice_session_sync_playback_latency(): removed. If there were an
active playback channel, it called
spice_playback_channel_sync_latency().

spice_playback_channel_sync_latency(): removed. This function
triggered the "min-latency" channel signal.

This "min-latency" channel signal is used for spice-pulse to react to
the min-latency attribute change.

It is not clear to me when reading this patch where the min-latency
was changed, in regards to the frame dropped.

---

# [client,v3,5/6] spice-session: Keep track of the global streams lag

struct VideoDecoder::decoding_time: new field

mjpeg_decoder_decode_frame: compute and save the moving average of the
decoding time (decoder->base.decoding_time)
sink_event_probe: idem

spice_display_channel_get_lag: new function computing the max
decoder_lag for all the channel streams. Could be modified to use
guards instead of big if() {...}

display_handle_stream_data: if spice_session_lag_needs_update(), call
spice_session_update_lag(). Has a 'FIXME'.

spice_playback_channel_get_lag: renamed from
spice_playback_channel_get_latency.

spice_playback_channel_set_delay: updated to update the lag if
necessary.

spice_session_get_lag: new function. Returns session->priv->lag.
spice_session_update_lag: new function. Could be modified to use
guards instead of big if() {...}. If the session_lag_needs_update(),
computes the max channel lag and calls
spice_playback_channel_update_lag() if the lag value has changed.

spice_session_get_playback_lag: renamed from
spice_session_get_playback_latency.

spice_playback_channel_update_lag: new function. Sets the min_latency
and triggers the "min-latency" signal if the channel is active.

spice_session_lag_needs_update(old_lag, new_lag): new macro. Returns
true is there is no old lag, or if the distance between old and new is
> 10.

---

# [client,v3,6/6] mjpeg: Take the decoding time into account to
  display frames

mjpeg_decoder_schedule: modified to substract the frame decoding time
when setting the the frame decoding timer (only if the wait time is
greater than the decoding time).


More information about the Spice-devel mailing list