From d43f3dc50abb976b08dbbbb074f6897cc1abfeff Mon Sep 17 00:00:00 2001 From: Wind Yuan Date: Thu, 15 Mar 2012 04:58:04 -0400 Subject: [PATCH] decode: delay NEWSEGMENT event if vaapidecode element was not linked. Rationale: playbin2 links all elements at run-time. Once vaapidecode is created and a NEWSEGMENT event arrives, downstream element may not be ready yet. So, delay this event until next element is chained in, otherwise basesink could output "Received buffer without a new-segment. Assuming timestamps start from 0". Signed-off-by: Gwenole Beauchesne --- gst/vaapi/gstvaapidecode.c | 31 ++++++++++++++++++++++++++++++- gst/vaapi/gstvaapidecode.h | 1 + 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c index 862b478493..5035fcd164 100644 --- a/gst/vaapi/gstvaapidecode.c +++ b/gst/vaapi/gstvaapidecode.c @@ -457,6 +457,11 @@ gst_vaapidecode_finalize(GObject *object) decode->allowed_caps = NULL; } + if (decode->delayed_new_seg) { + gst_event_unref(decode->delayed_new_seg); + decode->delayed_new_seg = NULL; + } + G_OBJECT_CLASS(parent_class)->finalize(object); } @@ -654,7 +659,16 @@ gst_vaapidecode_set_caps(GstPad *pad, GstCaps *caps) return FALSE; if (!gst_vaapidecode_update_src_caps(decode, caps)) return FALSE; - return gst_vaapidecode_reset(decode, decode->sinkpad_caps); + if (!gst_vaapidecode_reset(decode, decode->sinkpad_caps)) + return FALSE; + + /* Propagate NEWSEGMENT event downstream, now that pads are linked */ + if (decode->delayed_new_seg) { + if (gst_pad_push_event(decode->srcpad, decode->delayed_new_seg)) + gst_event_unref(decode->delayed_new_seg); + decode->delayed_new_seg = NULL; + } + return TRUE; } static GstFlowReturn @@ -685,6 +699,20 @@ gst_vaapidecode_sink_event(GstPad *pad, GstEvent *event) GST_DEBUG("handle sink event '%s'", GST_EVENT_TYPE_NAME(event)); /* Propagate event downstream */ + switch (GST_EVENT_TYPE(event)) { + case GST_EVENT_NEWSEGMENT: + if (decode->delayed_new_seg) { + gst_event_unref(decode->delayed_new_seg); + decode->delayed_new_seg = NULL; + } + if (!GST_PAD_PEER(decode->srcpad)) { + decode->delayed_new_seg = gst_event_ref(event); + return TRUE; + } + break; + default: + break; + } return gst_pad_push_event(decode->srcpad, event); } @@ -726,6 +754,7 @@ gst_vaapidecode_init(GstVaapiDecode *decode, GstVaapiDecodeClass *klass) decode->decoder_ready = NULL; decode->decoder_caps = NULL; decode->allowed_caps = NULL; + decode->delayed_new_seg = NULL; decode->use_ffmpeg = USE_FFMPEG_DEFAULT; decode->is_ready = FALSE; diff --git a/gst/vaapi/gstvaapidecode.h b/gst/vaapi/gstvaapidecode.h index 6725bcbf57..6a5792dff1 100644 --- a/gst/vaapi/gstvaapidecode.h +++ b/gst/vaapi/gstvaapidecode.h @@ -71,6 +71,7 @@ struct _GstVaapiDecode { GCond *decoder_ready; GstCaps *decoder_caps; GstCaps *allowed_caps; + GstEvent *delayed_new_seg; unsigned int use_ffmpeg : 1; unsigned int is_ready : 1; };