[Spice-devel] [PATCH spice-gtk] gstreamer: set timestamp in buffer's GstReferenceTimestampMeta
Snir Sheriber
ssheribe at redhat.com
Tue Jan 1 10:07:57 UTC 2019
Hi,
On 1/1/19 11:51 AM, Frediano Ziglio wrote:
>> Currently we set timestamps as buffer's PTS, this value may be changed by
>> the pipeline in some cases and cause an unexpected buffer warnings (when
>> GstVideoOverlay is not used). Use GstReferenceTimestampMeta when
>> synchronization is made by spice.
>>
>> Signed-off-by: Snir Sheriber <ssheribe at redhat.com>
>> ---
>>
>> Currently it's causing to an error if you running with
s/error/warning/
>> DISABLE_GSTVIDEOOVERLAY=1
>> and start some audio playback in the guest.
>>
> The patch make sense but looking at the commit message looks like that
> to remove a warning you introduced an error.
> It would be worth mentioning in which case(s) you have the warning and
> which warning (I supposed "got an unexpected decoded buffer!" or
> "the GStreamer pipeline dropped a frame").
> Which error are you getting now?
You are right, a warning, not an error,I meant to explain how i got the
"got an unexpected decoded buffer!" warning
before applying this patch :p
Snir.
>> ---
>> src/channel-display-gst.c | 27 ++++++++++++++++++++++++---
>> 1 file changed, 24 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
>> index 2c07f35..a00f53e 100644
>> --- a/src/channel-display-gst.c
>> +++ b/src/channel-display-gst.c
>> @@ -33,6 +33,10 @@ typedef struct SpiceGstFrame SpiceGstFrame;
>>
>> /* GStreamer decoder implementation */
>>
>> +#if GST_CHECK_VERSION(1,14,0)
>> +static GstStaticCaps stream_reference =
>> GST_STATIC_CAPS("timestamp/spice-stream");
>> +#endif
>> +
>> typedef struct SpiceGstDecoder {
>> VideoDecoder base;
>>
>> @@ -88,7 +92,14 @@ struct SpiceGstFrame {
>> static SpiceGstFrame *create_gst_frame(GstBuffer *buffer, SpiceFrame *frame)
>> {
>> SpiceGstFrame *gstframe = g_new(SpiceGstFrame, 1);
>> +#if GST_CHECK_VERSION(1,14,0)
>> + GstReferenceTimestampMeta *time_meta;
>> +
>> + time_meta = gst_buffer_get_reference_timestamp_meta(buffer,
>> gst_static_caps_get(&stream_reference));
>> + gstframe->timestamp = time_meta->timestamp;
>> +#else
>> gstframe->timestamp = GST_BUFFER_PTS(buffer);
>> +#endif
>> gstframe->frame = frame;
>> gstframe->sample = NULL;
>> return gstframe;
>> @@ -213,6 +224,12 @@ static void fetch_pending_sample(SpiceGstDecoder
>> *decoder)
>> decoder->pending_samples--;
>>
>> GstBuffer *buffer = gst_sample_get_buffer(sample);
>> + GstClockTime buffer_ts;
>> +#if GST_CHECK_VERSION(1,14,0)
>> + buffer_ts = gst_buffer_get_reference_timestamp_meta(buffer,
>> gst_static_caps_get(&stream_reference))->timestamp;
>> +#else
>> + buffer_ts = GST_BUFFER_PTS(buffer);
>> +#endif
>>
>> /* gst_app_sink_pull_sample() sometimes returns the same buffer
>> twice
>> * or buffers that have a modified, and thus unrecognizable, PTS.
>> @@ -225,7 +242,7 @@ static void fetch_pending_sample(SpiceGstDecoder
>> *decoder)
>> GList *l = g_queue_peek_head_link(decoder->decoding_queue);
>> while (l) {
>> gstframe = l->data;
>> - if (gstframe->timestamp == GST_BUFFER_PTS(buffer)) {
>> + if (gstframe->timestamp == buffer_ts) {
>> /* The frame is now ready for display */
>> gstframe->sample = sample;
>> decoder->display_frame = gstframe;
>> @@ -234,7 +251,7 @@ static void fetch_pending_sample(SpiceGstDecoder
>> *decoder)
>> * frames from the decoding queue.
>> */
>> while ((gstframe =
>> g_queue_pop_head(decoder->decoding_queue))) {
>> - if (gstframe->timestamp == GST_BUFFER_PTS(buffer)) {
>> + if (gstframe->timestamp == buffer_ts) {
>> break;
>> }
>> /* The GStreamer pipeline dropped the corresponding
>> @@ -648,9 +665,13 @@ static gboolean
>> spice_gst_decoder_queue_frame(VideoDecoder *video_decoder,
>> frame->data,
>> frame->size, 0,
>> frame->size,
>> frame->data_opaque,
>> frame->unref_data);
>>
>> + GstClockTime pts = gst_clock_get_time(decoder->clock) -
>> gst_element_get_base_time(decoder->pipeline) + ((uint64_t)MAX(0, latency)) *
>> 1000 * 1000;
>> 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;
>> +#if GST_CHECK_VERSION(1,14,0)
>> + gst_buffer_add_reference_timestamp_meta(buffer, gst_static_caps_get
>> (&stream_reference), pts, GST_CLOCK_TIME_NONE);
>> +#endif
>>
>> if (decoder->appsink != NULL) {
>> SpiceGstFrame *gst_frame = create_gst_frame(buffer, frame);
> Frediano
More information about the Spice-devel
mailing list