diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c index b75c165250..e6f306dd03 100644 --- a/gst/subparse/gstsubparse.c +++ b/gst/subparse/gstsubparse.c @@ -86,6 +86,7 @@ static void gst_sub_parse_class_init (GstSubParseClass * klass); static void gst_sub_parse_init (GstSubParse * subparse); static gboolean gst_sub_parse_src_event (GstPad * pad, GstEvent * event); +static gboolean gst_sub_parse_src_query (GstPad * pad, GstQuery * query); static gboolean gst_sub_parse_sink_event (GstPad * pad, GstEvent * event); static GstStateChangeReturn gst_sub_parse_change_state (GstElement * element, @@ -201,6 +202,8 @@ gst_sub_parse_init (GstSubParse * subparse) subparse->srcpad = gst_pad_new_from_static_template (&src_templ, "src"); gst_pad_set_event_function (subparse->srcpad, GST_DEBUG_FUNCPTR (gst_sub_parse_src_event)); + gst_pad_set_query_function (subparse->srcpad, + GST_DEBUG_FUNCPTR (gst_sub_parse_src_query)); gst_element_add_pad (GST_ELEMENT (subparse), subparse->srcpad); subparse->textbuf = g_string_new (NULL); @@ -217,6 +220,46 @@ gst_sub_parse_init (GstSubParse * subparse) * Source pad functions. */ +static gboolean +gst_sub_parse_src_query (GstPad * pad, GstQuery * query) +{ + GstSubParse *self = GST_SUBPARSE (gst_pad_get_parent (pad)); + gboolean ret = FALSE; + + GST_DEBUG ("Handling %s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_SEEKING: + { + GstFormat fmt; + gboolean seekable = FALSE; + + ret = TRUE; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + GstQuery *peerquery = gst_query_new_seeking (GST_FORMAT_BYTES); + + seekable = gst_pad_peer_query (self->sinkpad, peerquery); + if (seekable) + gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL); + gst_query_unref (peerquery); + } + + gst_query_set_seeking (query, fmt, seekable, seekable ? 0 : -1, -1); + + break; + } + default: + ret = gst_pad_peer_query (self->sinkpad, query); + break; + } + + gst_object_unref (self); + + return ret; +} + static gboolean gst_sub_parse_src_event (GstPad * pad, GstEvent * event) { diff --git a/gst/subparse/samiparse.c b/gst/subparse/samiparse.c index e8ea72afcb..955ee4c419 100644 --- a/gst/subparse/samiparse.c +++ b/gst/subparse/samiparse.c @@ -342,6 +342,7 @@ static xmlSAXHandler samiSAXHandlerStruct = { NULL, /* endElementNsSAX2Func */ NULL /* xmlStructuredErrorFunc */ }; + static xmlSAXHandlerPtr samiSAXHandler = &samiSAXHandlerStruct; void