[Spice-devel] [PATCH spice-gtk] channel-display-gst: Avoid PTS to decrease

Snir Sheriber ssheribe at redhat.com
Sun Feb 3 09:50:13 UTC 2019


Hi,

On 1/31/19 5:43 PM, Frediano Ziglio wrote:
> GStreamer does not accept PTS to decrease and set the new PTS
> with the value of the previous one.
> This causes our code to not match output frames with input ones.
> Make sure PTS always increases (even if very slowly).
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>   src/channel-display-gst.c | 9 ++++++++-
>   1 file changed, 8 insertions(+), 1 deletion(-)
>
> This should avoid the issues the following patch is trying
> also to fix:
> https://patchwork.freedesktop.org/patch/277721/
>
> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> index 4272ade8..7d7b435d 100644
> --- a/src/channel-display-gst.c
> +++ b/src/channel-display-gst.c
> @@ -42,6 +42,8 @@ typedef struct SpiceGstDecoder {
>       GstAppSink *appsink;
>       GstElement *pipeline;
>       GstClock *clock;
> +    // minimum PTS attached to the next frame to avoid decreasing it
> +    GstClockTime next_minimum_pts;
>   
>       /* ---------- Decoding and display queues ---------- */
>   
> @@ -657,9 +659,14 @@ 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;
> +    pts = MAX(pts, decoder->next_minimum_pts);
> +    decoder->next_minimum_pts = pts + 1;
>       GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE;
>       GST_BUFFER_DTS(buffer) = GST_CLOCK_TIME_NONE;
> -    GST_BUFFER_PTS(buffer) = gst_clock_get_time(decoder->clock) - gst_element_get_base_time(decoder->pipeline) + ((uint64_t)MAX(0, latency)) * 1000 * 1000;
> +    GST_BUFFER_PTS(buffer) = pts;
>   
>       SpiceGstFrame *gst_frame = create_gst_frame(buffer, frame);
>       g_mutex_lock(&decoder->queues_mutex);




This should fix the issue, I am not sure what is the dropping policy of 
the different sinks, but such increasing may cause late
frames to be renderd now (I think they are usually skipped , needs to 
see how (& if) it affects, "feels" smoother or the opposite?)

BTW I personally still prefer to use GstReferenceTimestampMeta if 
possible and do not mess with the buffer's main time-stamp.


Snir.



More information about the Spice-devel mailing list