diff options
author | Jan Schmidt <thaytan@mad.scientist.com> | 2005-04-25 03:54:28 +0000 |
---|---|---|
committer | Jan Schmidt <thaytan@mad.scientist.com> | 2005-04-25 03:54:28 +0000 |
commit | c6235da6784a3cd553af27a935912cfb3a929e78 (patch) | |
tree | eae89bea90d8556018fccc1482f35e382bbbdd7b | |
parent | 418ac696511072cbac7539e9f71abd047e8582a0 (diff) | |
download | gstreamer-c6235da6784a3cd553af27a935912cfb3a929e78.tar.gz |
IRC conversation with jdahlin about some aspects of gstreamer+python
Original commit message from CVS:
IRC conversation with jdahlin about some aspects of gstreamer+python
-rw-r--r-- | docs/random/thaytan/python-elements.txt | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/docs/random/thaytan/python-elements.txt b/docs/random/thaytan/python-elements.txt new file mode 100644 index 0000000000..8999875015 --- /dev/null +++ b/docs/random/thaytan/python-elements.txt @@ -0,0 +1,134 @@ +Feb 22 01:45:36 <thaytan> jdahlin: can I access GstXOverlay and friends from pygst? +Feb 22 01:45:43 <jdahlin> thaytan: indeed you can! +Feb 22 01:46:05 <jdahlin> thaytan: do not forget to import gst.interfaces +Feb 22 01:46:20 <thaytan> wheeeeee! +Feb 22 01:46:28 * thaytan hi5s jdahlin +Feb 22 01:46:32 <jdahlin> after that it's all magic +Feb 22 01:46:46 <thaytan> Company and I were discussing yesterday having a gst python element +Feb 22 01:46:57 <jdahlin> that'd be cool +Feb 22 01:47:11 <jdahlin> or just <any language except c> +Feb 22 01:47:23 <thaytan> that might do something like: instantiate a python interpreter, load python modules that implement gstreamer elements from a path location and register +them +Feb 22 01:47:39 <thaytan> then for each instance of each element, start a new python interpreter instance to execute it +Feb 22 01:47:48 <jdahlin> thaytan: yes, but we need to have a loader api first +Feb 22 01:47:50 <thaytan> does that sound like the right approach? +Feb 22 01:48:02 <jdahlin> yes, that's what I had in mind too +Feb 22 01:48:17 <jdahlin> but the code should probably be separated from the rest of the core +Feb 22 01:48:18 <thaytan> loader api? +Feb 22 01:48:29 <thaytan> oh, I was thinking in gst-plugins +Feb 22 01:48:34 <jdahlin> so, we can have the python plugin loader in a separate .so +Feb 22 01:48:42 <thaytan> but I guess gst-python could install it +Feb 22 01:48:52 <thaytan> since you have to have gst-python to run such elements anyway +Feb 22 01:49:00 <jdahlin> nope +Feb 22 01:49:10 <jdahlin> or hmm +Feb 22 01:49:24 <thaytan> the python elements need to be able to call gstreamer functions +Feb 22 01:49:30 <thaytan> hence, they need the wrappers +Feb 22 01:49:31 <jdahlin> yeah, most likely a python plugin will use the gstreamer api +Feb 22 01:49:51 <jdahlin> so a GTypeModule loader would be fine for me +Feb 22 01:50:06 <jdahlin> similar to what nautilus does +Feb 22 01:51:43 <thaytan> erm, hrmn +Feb 22 01:51:48 <thaytan> I don't know what that implies +Feb 22 01:52:13 <jdahlin> so, we need to define a simple api, for a plugin loader +Feb 22 01:52:29 <thaytan> python api, you mean? +Feb 22 01:52:31 <jdahlin> and then on startup, we look in $libdir/gstreamer-x.y/loaders/ for *.so +Feb 22 01:52:46 <thaytan> oh, I see +Feb 22 01:52:52 <jdahlin> one for python, and maybe move the current one to be a dll too +Feb 22 01:53:12 <jdahlin> it probably has disadvantages to move, so I'm not making that decision +Feb 22 01:53:40 <thaytan> well, afaics, they can just be normal gst plugins that in the plugin_init, they instantiate their language binding, load the available elements and get +them to register themselves +Feb 22 01:53:45 <jdahlin> and one for every language which wants to be able to write elements +Feb 22 01:54:09 <jdahlin> perhaps, I'm not sure how plugins work, but maybe it's possible +Feb 22 01:54:31 <thaytan> we want to get them in the registry with a factory function that knows how to instantiate the interpreter and create an instance of the element to run in it +Feb 22 01:54:50 <thaytan> and some way to shut down that instance when the element disappears +Feb 22 01:55:18 <jdahlin> would be a nice idea to only start the python interpretor on demand +Feb 22 01:55:24 <thaytan> for python, do we need a separate interpreter instance for every element? +Feb 22 01:55:35 <thaytan> so they can run properly in separate threads? +Feb 22 01:55:56 <jdahlin> no, that is not supported +Feb 22 01:56:02 <jdahlin> all elements are going to run in the same interpretor +Feb 22 01:56:17 <jdahlin> interpreter! +Feb 22 01:56:18 <thaytan> that might cause deadlocks? +Feb 22 01:56:35 <thaytan> my understanding is that the python interpreter is single-threaded only +Feb 22 01:56:47 <jdahlin> no, it can be multi-threaded +Feb 22 01:56:59 <jdahlin> but we'll probably have interesting issues +Feb 22 01:57:16 <thaytan> so nautilus already does something like this, you say? +Feb 22 01:57:20 <jdahlin> actually it's not supported to have multiple python interpreters in the same process +Feb 22 01:57:33 <jdahlin> yes, it reuses the interpreter state for all plugins/modules +Feb 22 01:57:55 <thaytan> we should check that out +Feb 22 01:58:08 * jdahlin wrote that code +Feb 22 01:58:22 <jdahlin> but it's mainly a proof of concept +Feb 22 01:58:47 <thaytan> oh, heh +Feb 22 01:59:02 <thaytan> I guess you already know the gist of it then +Feb 22 01:59:23 <jdahlin> actually, when it comes to threads I usually start crying +Feb 22 01:59:32 <thaytan> yah, but you're a sensitive man +Feb 22 01:59:44 <jdahlin> yes +Feb 22 01:59:51 <thaytan> I heard you cried over the bit in terminator 2 where arnie goes into the molten metal +Feb 22 01:59:53 <jdahlin> we need real men like wtay to help us +Feb 22 02:00:14 <jdahlin> yes, that is such a sad moment +Feb 22 02:00:31 <thaytan> *giggle* +Feb 22 02:00:48 <thaytan> and I'm all like 'hah! take that Eddie Furlong!' +Feb 22 02:02:03 <jdahlin> actually I can't remember, since it was a long time ago I saw the movie the first time +Feb 22 02:23:17 <thaytan> jdahlin: so python-nautilus seems to bail out if python is already instantiated? +Feb 22 02:23:33 <jdahlin> thaytan: perhaps, proof of concept :) +Feb 22 02:37:41 <thaytan> jdahlin: how do I physically register a python-implemented class from C? +Feb 22 02:38:11 <thaytan> sorry, I mean how do I get a GType that creates a python object? +Feb 22 02:39:20 <thaytan> or alternatively, load a python file in the interpreter and give it a GstPlugin * so it can call gst.element_register for each element it implements +Feb 22 02:41:33 <jdahlin> thaytan: you'll register the class in python (gobject.type_register) +Feb 22 02:41:54 <jdahlin> which will create a PyGType and a GType +Feb 22 02:42:16 <thaytan> ok, so we need the second method +Feb 22 02:42:39 <thaytan> the .py file implements a plugin_init function for us to pass a GstPlugin instance to +Feb 22 02:43:31 <thaytan> thomasvs: woah, how far behind am I? +Feb 22 02:43:43 <thaytan> thomasvs: in my stream, Uraeus just said the 'basically' stuff +Feb 22 02:47:49 <jdahlin> thaytan: no, it's fine to register the plugin in python, then we can just introspect and get a list of all classes subclassed from say gst.Element +Feb 22 02:50:02 <thaytan> jdahlin: I'm wondering how it works: I write a C plugin that instantiates a python interpreter in the plugin_init function, and then iterates a directory of .py files as python-nautilus does +Feb 22 02:50:47 <thaytan> it finds the plugin_init function inside each .py file, and needs to call it, passing a python-wrapper something or other for the GstPlugin * it was given +Feb 22 02:51:11 <thaytan> how do I go from an existing GstPlugin * to something I can pass to python? +Feb 22 02:52:33 <thaytan> is that what nautilus_python_object_get_type is doing? +Feb 22 02:52:59 <thaytan> ds: so you just have to carefully avoid symbol collisions between 0.3 and 0.4? +Feb 22 02:53:38 <jdahlin> thaytan: no, there is no plugin_init, that's the global part of the module in python +Feb 22 02:55:05 <jdahlin> thaytan: the GstPlugin would in this case never be seen from the python code; you would just have global variables, __plugin__, __version__ etc + + +Feb 22 04:05:23 <jdahlin> thaytan: no, the registration code is called from python +Feb 22 04:06:02 <thaytan> I'm trying to figure out a simpler problem +Feb 22 04:06:17 <thaytan> well, one earlier in the chain - how to allow GstElements that are implemented in python +Feb 22 04:06:40 <jdahlin> it's the same problem! +Feb 22 04:06:42 <thaytan> at the moment it seems I can't derive a GstElement in python and have it work? +Feb 22 04:06:55 <jdahlin> well, sort of +Feb 22 04:07:02 <-- caro has quit ("using sirc version 2.211+KSIRC/1.3.10") +Feb 22 04:07:08 <jdahlin> that needs some work, without doubts +Feb 22 04:07:13 <thaytan> yes, sort of - creating a derived Gstelement is one problem +Feb 22 04:07:18 <thaytan> registering it is another +Feb 22 04:07:41 <thaytan> I was just reading through pygtk and trying to understand +Feb 22 04:07:48 <jdahlin> I did implement something that I used as a filesrc +Feb 22 04:07:54 <jdahlin> in pure python at some point +Feb 22 04:08:03 <thaytan> how do you specify, say, the state_change handler? +Feb 22 04:08:05 <jdahlin> but most of the functions in GstElement and GstPad are not implemented +Feb 22 04:08:13 <jdahlin> I didn't +Feb 22 04:08:14 <jdahlin> :D +Feb 22 04:08:22 <thaytan> aha :) +Feb 22 04:08:37 <jdahlin> thaytan: examples/gst/filesrc.py +Feb 22 04:08:46 <thaytan> I'm trying to figure out how GObject class function pointers get mapped to Python +Feb 22 04:08:48 <jdahlin> just a get_function on the source bad +Feb 22 04:08:52 <jdahlin> pad +Feb 22 04:09:22 <thaytan> gst_element_set_state becomes gst.Element.set_state, which is clear enough +Feb 22 04:09:46 <thaytan> but what happens if set_state is also a class method you want to override? +Feb 22 04:10:18 <jdahlin> in pygtk 2.5.x and higher you can do that +Feb 22 04:10:27 <jdahlin> It'll be prefixed by do_ +Feb 22 04:10:52 <thaytan> and there's a gst_element_do_set_state() and a 'set_state' function ptr? +Feb 22 04:10:58 <thaytan> and _if_ theres... +Feb 22 04:11:23 <jdahlin> tough luck. +Feb 22 04:11:48 <jdahlin> well, seriously +Feb 22 04:11:55 <jdahlin> then do_set_state will be renamed in the python bindings. +Feb 22 04:19:15 <thaytan> jdahlin: so ok, our step 1 is to enhance pygst to support all the class methods +Feb 22 04:22:30 <jdahlin> thaytan: that is easy, we need to update the defs file and add virtuals methods. then we need to require pygtk 2.6.0 when it's out (in a few weeks, maximum) +Feb 22 04:31:05 <thaytan> jdahlin: what does a virtual defn look like in a .defs file? +Feb 22 04:31:20 <jdahlin> thaytan: not sure, look in pygtk cvs head +Feb 22 04:31:24 * jdahlin didn't write that code +Feb 22 04:31:34 <thaytan> I've got 2.5.3 - not recent enough? +Feb 22 04:31:41 <jdahlin> yeah, it is +Feb 22 04:34:38 <thaytan> jdahlin: aha found it. seems simple enough +Feb 22 04:34:40 <thaytan> (define-virtual pressed +Feb 22 04:34:40 <thaytan> (of-object "GtkButton") +Feb 22 04:34:40 <thaytan> (return-type "none") +Feb 22 04:34:40 <thaytan> ) + |