| GstTypes exist to try to make sure data eveyrone is talking about the |
| right kind of data. They aid quite a bit in autoplugging, in fact make it |
| possible. Each well-formed type includes a function (typefind) that will |
| take one or more buffers and determine whether or not it is indeed a |
| stream of that type, and possible a metadata to go with it. It may |
| provide related metadata structure IDs (and must if it provides metadata |
| from the typefind function). |
| |
| Because multiple elements and plugins are very likely to be using the same |
| types, the process of creating/finding types is designed to be done with a |
| single function call. All operations on GstTypes occur via their guint16 |
| ID numbers, with the GstType structure "private" to the GST library. A |
| plugin wishing to use a give type would contain a static struct of type |
| GstTypeFactory, which lists the MIME type, possible extensions (which may |
| overlap the mime-types file), a typefind function, and any other cruft I |
| decide to add. |
| |
| A plugin init function would take this typefactory and hand it to the |
| gst_type_new() (FIXME: badly named) function, which would first search for |
| that same MIME type in the current list. If it found one, it would |
| compare the two to see if the new one is "better". Better is defined as |
| having more extentions (to be merged) or a typefind function verses none. |
| |
| The point of returning an existing MIME type is a result of the goal of |
| unifying types enough to guarantee that, for instance, all MP3 decoders |
| will work interchangably. If MP3 decoder A says "MIME type 'audio/mpeg' |
| with extensions 'mpeg3'" and decoder B says "MIME type 'audio/mpeg' with |
| extensions 'mp3'", we don't want to have two types defined, possibly with |
| two typefind functions. If we did, it's not obvious which of the two would |
| be tried first (luck) and if both would really identify streams as mp3 |
| correctly in all cases. And whichever wins, we're stuck using the |
| associated decoder to play that stream. We lose the choice between any |
| valid mp3 decoder, and thus the whole point of the type system. |