| Properties: | |
| "template_caps" | |
| The union of all possible caps that a pad might have in any | |
| condition. Is a class property, and doesn't change over the | |
| life of an object. Set by the element during class init. | |
| "internal_caps" | |
| The caps that the element will allow on a pad, given its current | |
| state and the external_caps of all the other pads of the element. | |
| Set by the element. | |
| "external_caps" | |
| The caps representing what the core will allow on a pad. This is | |
| a combination of the peer's allowed caps, and filtering caps, and | |
| any in-process negotiation restrictions. Set by the core. | |
| "negotiated_caps" | |
| The format that the element will use. Set by the core. | |
| "filter_caps" | |
| The caps intersected with everything else during negotiation. Set | |
| by the application. | |
| "negotiable" | |
| A boolean that indicates that the pad is ready to negotiate. Set | |
| by the element. | |
| Negotiation steps, from the element perspective: | |
| - During object initialization, an element must set template_caps | |
| and allowed_caps for each pad. | |
| - In response to changes in the internal state of the element or in | |
| the peer_allowed_caps of any other pad owned by the element, the | |
| element should update allowed_caps of a pad. | |
| - Pads are initially created with negotiable as FALSE. When an | |
| element wants to indicate that negotiation is allowable, it should | |
| set negotiable to TRUE. | |
| - In response to a negotiate signal, an element should copy the caps | |
| in "allowed_caps" to "negotiated_caps", and extract any information | |
| needed to handle the format. At this point, "allowed_caps" is | |
| guaranteed to be fixed. | |
| Negotiation steps, from the core perspective: | |
| <ds> I'd like to split it up into manageable "projects" | |
| <ds> hopefully some of which we can recruit others to do | |
| <Company> i'd like a decision about if we drop threads | |
| <ds> in what sense? | |
| <ds> threads being not required? | |
| <Company> threads being not part of the API | |
| <ds> or threads being not used | |
| <Company> so no thread safety considerations | |
| <ds> I would like threads to not be part of the API | |
| <ds> requiring apps/plugins to be written thread-safely is insane | |
| <Company> the question is this: If someone calls gst_element_set_state (element, state), does he have to marshal it into the correct thread himself or not? | |
| <ds> no | |
| <ds> reason being: we already have to deal with subthreads | |
| <ds> we == the core | |
| <Company> then you'll have a lot of problems | |
| <Company> i'd like to just drop subthreads and be done with it | |
| --> StyXman (~mdione@200.59.114.71) has joined #gstreamer | |
| <ds> and run everything in one thread? | |
| <Company> yes | |
| <Company> schedulers are free to use threads though | |
| <ds> this is obviously a retreat | |
| <Company> right | |
| <ds> but perhaps a strategic one | |
| <Company> otherwise you have to guarantee that you get no races | |
| <ds> I've seen this as a viable option for some time | |
| <Company> there's stuff that just does not work as is currently | |
| <ds> it always seemed difficult to convince other people that it's the right thing to do | |
| <ds> for example, wtay | |
| <Company> like setting xwindow ids, changing states or app-events | |
| <Company> like seeks | |
| <-- iain has quit ("leaving") | |
| <Company> all of this has the typical thread issues currently: it sometimes works and sometimes crashes the app | |
| <Company> and that's not acceptable to me | |
| <ds> let's do it | |
| <Company> if you look at my 0.10 code, I've tried to have GstObjects belong to a "context" | |
| <ds> this all fits into the idea that I think we should be a lot more like gtk architecturally | |
| <ds> for example, gtk doesn't have anything like caps negotiation, where elements call each other recursively | |
| <Company> and have functions ensure they're in the right context or otherwise marshal | |
| <Company> yes it does | |
| <ds> ? | |
| <Company> size requests and allocations | |
| <ds> but that's more like how I want it -- setting a property and firing a signal telling others that it's updated | |
| <ds> as i understand it | |
| <Company> though gtk has the bonus of being a tree which we don't have, we have a directed, maybe cyclic graph | |
| <Company> and for caps, the graph isn't even directed | |
| <Company> gtk is far too simple for gst | |
| <ds> true | |
| <Company> i can't even come up with an analogy to a video transcoder | |
| <ds> but we do some relatively simple stuff in a complicated way | |
| <-- StyXman (~mdione@200.59.114.71) has left #gstreamer | |
| <Company> like? | |
| <ds> caps negotiation | |
| <Company> that's not simple | |
| <ds> passing around the data should be | |
| <ds> was it you or thomasvs that wanted to split core headers into app headers and plugin headers? | |
| <Company> I definitely wanted that | |
| <Company> app/plugin/registry to be exact | |
| <ds> registry? | |
| <ds> for functions that access "internal" stuff? | |
| <Company> stuff an app normally doesn't touch | |
| <Company> so we can do something like declare the "app" stuff supported for a longer time | |
| <ds> oooh, good call | |
| <ds> I'm sold | |
| <Company> so, now that threads are gone, what are the biggies I want in 0.10? | |
| <Company> 1) non-blocking main-loop integrated processing | |
| <ds> that's rather important if you don't have threads :) | |
| <Company> right | |
| <Company> but it works in my gst-01.0 stuff already | |
| <Company> minus the elements that need to be ported of cause | |
| <Company> which aren't that many fortunately | |
| <Company> though some are hard (like gnomevfs), because they have no non-blocking API | |
| <ds> a subclass of GstElement that fires up a helper thread? | |
| <ds> (dirty, but it works) | |
| <Company> probably | |
| <ds> - autopluggers would be easier to write if there was a core method | |
| <ds> to do what plugidentities do. | |
| <Company> no clue how to implement that | |
| <ds> there's also a note about bins being more involved with negotiation | |
| <Company> that's the next biggie: 2) fix the negotiation process to allow good autoplugging | |
| <ds> that was something I thought about last time around | |
| <Company> bins? | |
| <ds> that sounds like something I'd work on | |
| <ds> GstBin | |
| <Company> the only reason bhins still exist for me is to group elements | |
| <ds> so that a bin subclass could override how its children are negotiated | |
| <ds> much like GtkBin, actually | |
| <ds> and allocation | |
| <Company> hum | |
| <Company> how do you solve that issue with links that are only partly inside the bin and partly inside another one? | |
| <ds> that would be up to the parent (grandparent?) | |
| <Company> so all links must be in the same toplevel bin? | |
| <ds> yes | |
| <ds> isn't that the case currently? | |
| <ds> probably not checked | |
| <Company> pfff | |
| <Company> currently you can do anything | |
| <ds> heh | |
| <ds> what about state changes? | |
| <Company> dunno | |
| <Company> it's not really important for me | |
| <Company> apart from the EOS stuff | |
| <ds> I'd like states to be split into "what state does the app want me to be in" and "what state am I in" | |
| <ds> with the latter being under control of the element | |
| <Company> yeah, that'd be nice | |
| <ds> that way, you don't have multiple people trying to control the state | |
| <Company> we definitely need to fix EOS | |
| <Company> i'm not sure how we should handle errors | |
| <ds> element errors? | |
| <Company> yeah, if we want to explicitly unset errors or not | |
| <Company> currently on error the element goes to paused | |
| <ds> it's easier with actual_state | |
| <Company> in theory i just set it to PLAYING again and continue? | |
| <ds> the actual_state goes to PAUSED and fires a signal | |
| <Company> dunno, maybe actual_state should go to ERROR | |
| <ds> yeah | |
| <Company> that'd require gst_element_unset_error though | |
| <ds> with actual_state, we can add states without thinking too hard | |
| <Company> but if you can just unset it, why not just do it and continue | |
| <ds> the app may want to be involved | |
| <ds> especially to get the error message | |
| <ds> do we want a separate api section for autopluggers? | |
| <Company> why would we want that? | |
| <ds> or make it part of registry | |
| <Company> maybe s/registry/internal/ or some other name | |
| <ds> because autopluggers may want to access internal information that we wouldn't expose to apps or plugins | |
| <ds> could you add gst/gstcompat.c to your arch repo? | |
| <Company> hm | |
| <Company> what internal info would an autoplugger need | |
| <ds> depends | |
| <ds> whatever replaces plugidentities | |
| <Company> a simple one (decoder) just needs caps and ranks | |
| <ds> I meant for negotiation information | |
| <Company> hm | |
| <Company> no, i don't want a seperate section for it | |
| <Company> just put it in "internal", "extended" or whatever | |
| <ds> ok | |
| <ds> do we want to plan for the app api to be ABI compatible past 0.10? | |
| <ds> er, that's silly | |
| <ds> er, kinda silly | |
| <Company> API compat | |
| <Company> you could achieve ABI compat if you expose all objects just as typedefs | |
| <Company> lemme reboot into linux so i can add gstcompat.c | |
| <Company> brb | |
| <-- Company has quit (Read error: 104 (Connection reset by peer)) | |
| --> Company (~Company@pD95D53D9.dip.t-dialin.net) has joined #gstreamer | |
| --> ploum (~ploum@21-4.CampusNet.ucl.ac.be) has joined #gstreamer | |
| <-- marv has quit (Read error: 104 (Connection reset by peer)) | |
| <ds> so do you still support caps registration? | |
| <-- ploum has quit (Client Quit) | |
| <ds> registering media types, fields, descriptions, and default fixate functions? | |
| <ds> and validation | |
| <Company> yes | |
| <Company> that's an important thing we need | |
| <Company> otherwise people mess up by either carelessly doing stuff wrong or not understanding what they're supposed to do | |
| <ds> whose responsibility is it to register these? | |
| <ds> libgstplugins? | |
| <ds> a plugin? | |
| <ds> do we want this info in the registry so that a plugin can automatically be loaded to provide registration for video/x-raw-rgb? | |
| <Company> haven't really thought about that part yet | |
| <ds> it's somewhat similar to typefind functions | |
| <Company> yeah | |
| --> ultrafunk (~pd@eth779.vic.adsl.internode.on.net) has joined #gstreamer | |
| <Company> i'd probably have a seperate Factory for caps info | |
| <Company> and have the system load them when you use the caps info stuff | |
| <ds> should caps info be manditory? | |
| <ds> have you synced your repo? | |
| <Company> i'm trying to, but some commit was interrupted last time... | |
| <ds> how does one sync a local repository to fd.o? | |
| <ds> rsync? | |
| <Company> tla archive-mirror | |
| <ds> ah | |
| <Company> see rhythmbox.org => developers for how it works | |
| <Company> and _never_ press ctrl-c in arch | |
| <-- Misirlou has quit (Remote closed the connection) | |
| --> Misirlou (~asdf@c-24-125-118-27.va.client2.attbi.com) has joined #gstreamer | |
| <ds> is there a reason why a pad might know (and set) allowed_caps, but not be ready to negotiate? | |
| <Company> i don't know a good one | |
| <ds> know a bad one? | |
| <Company> "arch-mirror: unable to acquire revision lock (internal error in archive-pfs.c(pfs_lock_revision))" | |
| <Company> stupidly ordered code | |
| <Company> no, don't know one | |
| <ds> here's a good question: | |
| <ds> should the core negotiate links in a pipeline that are negotiatable, even though some other links are not negotiatable? | |
| <ds> this ends up making us negotiate some things multiple times | |
| <ds> filesrc ! mad ! audioconvert ! audioscale ! osssink | |
| <Company> the core doesn't know if links are negotiable | |
| <ds> it will in the future :) | |
| <Company> sinesrc ! identity ! osssink | |
| <Company> how does it know if sinesrc ! identity is negotiable? | |
| <ds> because the allowed_caps on the two pads intersect | |
| --> marv (~ilovekimm@host-216-76-232-134.hsv.bellsouth.net) has joined #gstreamer | |
| <ds> I'm pretty sure that I don't want gst_pad_link() to return negotiation errors | |
| <ds> ever | |
| <Company> you can't avoid that | |
| <ds> I want to separate "linkable" from "negotiable" | |
| <Company> ah, gst_pad_link | |
| <ds> so you can link videotestsrc ! identity ! osssink | |
| <Company> i confused it with GstPadLink | |
| <Company> yeah, i was thinking about that, too | |
| <ds> vts ! osssink won't link, since the pad templates don't intersect | |
| <Company> http://web.ics.purdue.edu/~kuliniew/wp/archives/2004/08/07/error-handling/ | |
| <Company> :) | |
| <ds> right now the vts ! id ! osssink pipeline fails to link | |
| <Company> yeah | |
| <Company> and goom ! xvimagesink only fails when xvimagesink is at least READY | |
| <Company> (assuming your xv can't do RGB) | |