diff options
author | Wind Yuan <feng.yuan@intel.com> | 2012-03-15 04:58:04 -0400 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-03-22 14:33:17 +0100 |
commit | d43f3dc50abb976b08dbbbb074f6897cc1abfeff (patch) | |
tree | f3296b366bd498183b18d932cf21f0e56507fe5e /gst | |
parent | baa80d97530abc92e451c90da8bbd2e366ec338b (diff) |
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 <gwenole.beauchesne@intel.com>
Diffstat (limited to 'gst')
-rw-r--r-- | gst/vaapi/gstvaapidecode.c | 31 | ||||
-rw-r--r-- | gst/vaapi/gstvaapidecode.h | 1 |
2 files changed, 31 insertions, 1 deletions
diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c index 862b4784..5035fcd1 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 6725bcbf..6a5792df 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; }; |