summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorWind Yuan <feng.yuan@intel.com>2012-03-15 04:58:04 -0400
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-03-22 14:33:17 +0100
commitd43f3dc50abb976b08dbbbb074f6897cc1abfeff (patch)
treef3296b366bd498183b18d932cf21f0e56507fe5e /gst
parentbaa80d97530abc92e451c90da8bbd2e366ec338b (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.c31
-rw-r--r--gst/vaapi/gstvaapidecode.h1
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;
};