Help with Gst.Iterator.find_custom() in python
Mathieu Duponchelle
mathieu at centricular.com
Fri May 21 16:15:10 UTC 2021
eg:
def gst_bin_get_by_gtype(b, type_name):
factory = Gst.ElementFactory.find(type_name)
return None if factory is None else next(filter(lambda c: c.__gtype__ == factory.get_element_type(), b.iterate_recurse()), None)
On 5/21/21 5:51 PM, Mathieu Duponchelle via gstreamer-devel wrote:
> Looks like a bug in pygobject, I tried to pinpoint it but that code base is
> a bit of a maze :(
>
> And I think there's actually two bugs: one is the parameters passed back
> to the closure as you noticed, the other one is the final return value when
> no match was found, these are two separate issues.
>
> Note that the gst-python overrides let you iterate the GstIterator as a normal
> python iterator, why don't you simply loop over it to find your object?
>
>> Hi, I'm trying to create a function in python to find elements in a bin based
>> on their type (not name).
>
> On 5/21/21 9:24 AM, Marianna S. Buschle via gstreamer-devel wrote:
>> Hi, I'm trying to create a function in python to find elements in a bin based
>> on their type (not name).
>>
>> I have such a function in C which works and I'm trying to convert it to
>> python but I'm experiencing some issues.
>>
>> def compare_gtype(element, type):
>> print(element)
>> print(type)
>>
>> return 1
>>
>> def gst_bin_get_by_gtype(bin, type_name):
>> factory = Gst.ElementFactory.find(type_name)
>> type = factory.get_element_type()
>> print(type_name)
>> print(type)
>>
>> print("[" + bin.get_name() + "]: looking up child element of type " +
>> type.name)
>>
>> children = bin.iterate_recurse()
>> if children:
>> print(children)
>> print(children.type)
>> found, elem = children.find_custom(compare_gtype, type)
>> else:
>> print("Error")
>>
>> if found:
>> print("Found")
>> return elem
>> else:
>> print("Not Found")
>> return None
>>
>> This is the output I get:
>>
>> filesink
>> <GType GstFileSink (140449056935968)>
>> [pipeline0]: looking up child element of type GstFileSink
>> <Gst.Iterator object at 0x7fbcded2bdc0 (GstIterator at 0x7fbcd0009220)>
>> <GType GstElement (140449054520272)>
>> <GType GstFileSink (140449056935968)>
>> 140448920294640
>> <GType GstFileSink (140449056935968)>
>> 140448920294640
>> <GType GstFileSink (140449056935968)>
>> 140448920294640
>> <GType GstFileSink (140449056935968)>
>> 140448920294640
>> <GType GstFileSink (140449056935968)>
>> 140448920294640
>> API Exception: {'type': 'TypeError', 'args': ('unknown type (null)',),
>> 'message': 'unknown type (null)'}
>> Traceback (most recent call last):
>> File "/usr/lib/python3/dist-packages/jsonrpc/manager.py", line 113, in
>> _get_responses
>> result = method(*request.args, **request.kwargs)
>> File "/home/msb/QtecGit/python-tests/gst_ctrl.py", line 248, in play
>> gst_handler.play(index)
>> File "/home/msb/QtecGit/python-tests/gst_ctrl.py", line 69, in play
>> elem = gst_bin_get_by_gtype(self.pipeline[index], "filesink")
>> File "/home/msb/QtecGit/python-tests/gst_ctrl.py", line 42, in
>> gst_bin_get_by_gtype
>> found, elem = children.find_custom(compare_gtype, type)
>> TypeError: unknown type (null)
>>
>> So for me it seems like the find_custom() is not passing the GstElement from
>> the iterator to the compare_gtype() function...
>>
>> And this is the pipeline it is searching (no filesink):
>> filesrc name=replay location=/home/msb/test.ts ! decodebin ! videoconvert !
>> ximagesink sync=1
>>
>> And just for reference the code in C:
>>
>> static gint
>> compare_gtype(const GValue *velement, GType type)
>> {
>> gint eq = 1;
>> GstElement *element = g_value_get_object(velement);
>>
>> GST_OBJECT_LOCK(element);
>> if (G_OBJECT_TYPE(element) == type)
>> eq = 0;
>> GST_OBJECT_UNLOCK(element);
>>
>> return eq;
>> }
>>
>> static GstElement *
>> gst_bin_get_by_gtype(GstBin *bin, GType type)
>> {
>> GstIterator *children;
>> GValue result = { 0, };
>> GstElement *element;
>> gboolean found;
>>
>> g_return_val_if_fail(GST_IS_BIN(bin), NULL);
>>
>> QTEC_DEBUG("[%s]: looking up child element of type %s",
>> GST_ELEMENT_NAME(bin), g_type_name(type));
>>
>> children = gst_bin_iterate_recurse(bin);
>> found = gst_iterator_find_custom(children,
>> (GCompareFunc) compare_gtype,
>> &result, (gpointer) type);
>> gst_iterator_free(children);
>>
>> if (found) {
>> element = g_value_dup_object(&result);
>> g_value_unset(&result);
>> } else {
>> element = NULL;
>> }
>>
>> return element;
>> }
>>
>> GstElementFactory * proxysrc_factory =
>> gst_element_factory_find("proxysrc");
>>
>> if (!proxysrc_factory)
>> return FALSE;
>>
>> GType proxysrc_type =
>> gst_element_factory_get_element_type(proxysrc_factory);
>>
>> GstElement *psrc = gst_bin_get_by_gtype(GST_BIN(bin), proxysrc_type);
>>
>>
>>
>> --
>> Sent from: http://gstreamer-devel.966125.n4.nabble.com/
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210521/42779b07/attachment.htm>
More information about the gstreamer-devel
mailing list