GstMeta Provide context for buffers The point of the metadata is to provide some context for each buffer. In the case of audio data, for instance, it would provide the samplerate, bit depth, and channel count. The trick is that there may be multiple types of metadata ganged onto a single buffer. This is why they're going to be a GList. This does mean extra overhead in all cases, but I think it's minimal. The GList type uses a chunk allocater so we're not wasting too much memory or time when adding to the list. The trick is dealing with these structs as they pass through a pipeline, since they have potentially different mutability properties. For instance, if you've got a mp3 decoder connected to a tee, which sends the buffers off to both the decoder and a spectrum analyzer (and then a visualization element). The preferred setup would be where every time a audio/raw metadata comes down the pipe (indicating a potential change in audio format), the audiosink and spectrum would just save off pointers. So when exactly does this metadata go away (deallocated)? Well, that means metadata has to be refcounted. But that gets rather hairy. OK, in the simple case you create a metadata struct, it comes with refcount set to 1. You pass it through, it stays one, eventually someone drops the last reference on the buffer it's tied to, you free the metadata too. Easy. What if you tee? You could go through and for every metadata in the buffer, increment the refcount by the same as the buffer. So in the above case (tee'd), the audiosink and spectrum would get the buffer with a refcount of 2, and it'd have a metadata with refcount 2. Do they ref it each themselves, then unref the buffer? Or do they remove the metadata? Removing the metadata would require a buffer CoW, which would suck, so yes, they'd just ref the metadata. But.... what if they're all in different threads? Then we're off into the magical world of mutexes. Everything with a refcount in a threaded world must be mutexed, else you can do atomic increment and atomic dec and test. Can this be done from C easily? Perhaps it needs to be found from kernel includes via autoconf? The goal in designing the way metadata will be defined and used is to keep it as simple as possible. The basis for accomplishing this is the fact that in order to actually use (rather than just pass) the metadata, you have to know what the fields are, which means you have to have compiled in support for that metadata at build time. Therefore, if you're using metadata, you must have build-time access to the necessary include file that defines it. So, given that you've got an include file, it would be nice if the whole thing could be contained there. This would limit the need to be linked against something, or have load-time requirements as to that has to be loaded before you are. Given that really all metadata is is a region of memory of a given size with a certain signature, this isn't all that hard. First you lay out the struct that defines the metadata. Then you set up #defines that expand to the size of the struct in question, as well as the four-cc code that defines the type. The work is done by a few #defines, a la the #defines used in all Gtk objects. The first is a NEW() method that allocates the memory for the metadata and fills in all the normal fields (type, size, utility functions). Because of the way it's defined (as a #define, no less), you'll have to invoke it as META_NEW(meta), since it can't return() anything. Another #define will check to make sure a meta is indeed that type by verifying the type code and size. Theoretically, meta types can overlap with the same fourcc code, as long as they have different sizes. But I probably ought to have a global public registry so people writing things don't conflict. MSFT got that right, at least. So, a hairy problem is what to do when there are utility functions associated with one of these things. One option is to not bother with them. This is very likely a possible solution, since metadata is supposed to be flat memory of a given size. Not much to do to either free or copy it, is there? @meta: @buf: @meta: @flag: @meta: @flag: @meta: @flag: @GST_META_FREEABLE: @lock: @flags: @data: @size: @size: @Returns: @type: @meta: @meta: