Now metadataparse works in push or pull mode.

Original commit message from CVS:
Now metadataparse works in push or pull mode.
This commit is contained in:
Edgard Lima 2007-11-02 12:03:04 +00:00
parent 929954f595
commit 05e1fdf681
2 changed files with 35 additions and 18 deletions

View File

@ -1,3 +1,10 @@
2007-11-02 Edgard Lima <edgard.lima@indt.org.br>
* ext/metadata/gstmetadataparse.c: (gst_metadata_parse_init),
(gst_metadata_parse_activate), (gst_metadata_parse_get_range),
(gst_metadata_parse_element_activate_src_pull):
Now metadataparse works in push or pull mode.
2007-11-01 Edgard Lima <edgard.lima@indt.org.br> 2007-11-01 Edgard Lima <edgard.lima@indt.org.br>
* configure.ac: * configure.ac:

View File

@ -143,6 +143,9 @@ gst_metadata_parse_get_range (GstPad * pad, guint64 offset, guint size,
static gboolean gst_metadata_parse_activate (GstPad * pad); static gboolean gst_metadata_parse_activate (GstPad * pad);
static gboolean
gst_metadata_parse_element_activate_src_pull (GstPad * pad, gboolean active);
static void gst_metadata_parse_init_members (GstMetadataParse * filter); static void gst_metadata_parse_init_members (GstMetadataParse * filter);
static void gst_metadata_parse_dispose_members (GstMetadataParse * filter); static void gst_metadata_parse_dispose_members (GstMetadataParse * filter);
@ -242,9 +245,9 @@ gst_metadata_parse_init (GstMetadataParse * filter,
GST_DEBUG_FUNCPTR (gst_metadata_parse_get_caps)); GST_DEBUG_FUNCPTR (gst_metadata_parse_get_caps));
gst_pad_set_event_function (filter->srcpad, gst_metadata_parse_src_event); gst_pad_set_event_function (filter->srcpad, gst_metadata_parse_src_event);
gst_pad_use_fixed_caps (filter->srcpad); gst_pad_use_fixed_caps (filter->srcpad);
#if 0 /* FIXME it should also work with it */
gst_pad_set_getrange_function (filter->srcpad, gst_metadata_parse_get_range); gst_pad_set_getrange_function (filter->srcpad, gst_metadata_parse_get_range);
#endif gst_pad_set_activatepull_function (filter->srcpad,
GST_DEBUG_FUNCPTR (gst_metadata_parse_element_activate_src_pull));
/* addind pads */ /* addind pads */
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
@ -813,12 +816,12 @@ gst_metadata_parse_activate (GstPad * pad)
int res; int res;
guint32 offset = 0; guint32 offset = 0;
filter = GST_METADATA_PARSE (gst_pad_get_parent (pad)); filter = GST_METADATA_PARSE (GST_PAD_PARENT (pad));
if (!gst_pad_check_pull_range (pad) || if (!gst_pad_check_pull_range (pad) ||
!gst_pad_activate_pull (filter->sinkpad, TRUE)) { !gst_pad_activate_pull (filter->sinkpad, TRUE)) {
/* nothing to be done by now, activate push mode */ /* nothing to be done by now, activate push mode */
goto done; return gst_pad_activate_push (pad, TRUE);
} }
if (!(ret = if (!(ret =
@ -870,16 +873,12 @@ gst_metadata_parse_activate (GstPad * pad)
done: done:
if (ret) { if (ret) {
do { gst_pad_activate_pull (pad, FALSE);
if (!(ret = gst_pad_activate_pull (filter->sinkpad, FALSE))) gst_pad_activate_push (filter->srcpad, FALSE);
break; if (!gst_pad_is_active (pad)) {
if (!gst_pad_is_active (filter->sinkpad)) {
ret = gst_pad_activate_push (filter->srcpad, TRUE); ret = gst_pad_activate_push (filter->srcpad, TRUE);
ret = ret && gst_pad_activate_push (filter->sinkpad, TRUE); ret = ret && gst_pad_activate_push (pad, TRUE);
} }
} while (FALSE);
} }
return ret; return ret;
@ -891,22 +890,33 @@ gst_metadata_parse_get_range (GstPad * pad,
guint64 offset, guint size, GstBuffer ** buf) guint64 offset, guint size, GstBuffer ** buf)
{ {
GstMetadataParse *filter = NULL; GstMetadataParse *filter = NULL;
gboolean ret;
filter = GST_METADATA_PARSE (gst_pad_get_parent (pad)); filter = GST_METADATA_PARSE (GST_PAD_PARENT (pad));
if (filter->need_send_tag) { if (filter->need_send_tag) {
gst_metadata_parse_send_tags (filter); gst_metadata_parse_send_tags (filter);
} }
ret = gst_pad_pull_range (filter->sinkpad, offset, size, buf); return gst_pad_pull_range (filter->sinkpad, offset, size, buf);
}
static gboolean
gst_metadata_parse_element_activate_src_pull (GstPad * pad, gboolean active)
{
GstMetadataParse *filter = NULL;
gboolean ret;
filter = GST_METADATA_PARSE (gst_pad_get_parent (pad));
ret = gst_pad_activate_pull (filter->sinkpad, active);
gst_object_unref (filter); gst_object_unref (filter);
return ret; return ret;
} }
static GstStateChangeReturn static GstStateChangeReturn
gst_metadata_parse_change_state (GstElement * element, gst_metadata_parse_change_state (GstElement * element,
GstStateChange transition) GstStateChange transition)