[Spice-devel] [PATCH spice-gtk] channel-display-gst: Avoid PTS to decrease
Frediano Ziglio
fziglio at redhat.com
Thu Jan 31 18:16:40 UTC 2019
> 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.
>
> Hi,
>
> I looked in gstreamer documentation [0] that mentions:
> "The buffer PTS refers to the timestamp when the buffer
> content should be presented to the user and is not always
> monotonically increasing."
>
It looks like something in the pipeline is making it monotonic.
Maybe is something related to H264, maybe not but happened to
me and Snir too.
> It does not mean your claim is not true - maybe a decreasing
> PTS is only allowed for H264 B frames (and similar).
>
Well, no even streams with B-frames output frames in the
right sequence or you would see weird artifacts :-)
> [0]
> https://gstreamer.freedesktop.org/data/doc/gstreamer/1.14/gstreamer/html/GstBuffer.html
>
> > This causes our code to not match output frames with input ones.
> > Make sure PTS always increases (even if very slowly).
>
> Consider adding that this can happen when "latency" is changing
> and becomes smaller.
>
What about:
"This can happen if "latency" argument becomes smaller or during
the synchronization of audio and video times."
?
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
>
> Other than that, looks good to me.
>
> Uri.
>
>
> > ---
> > 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);
> >
>
>
More information about the Spice-devel
mailing list