| OUTDATED, EARLY IDEA |
| -------------------- |
| |
| When two pads are connected, a negotiation phase is going to have to |
| happen. Ideally, the caps of the two pads will both be fully-specified, |
| and match. That's the ideal case, but may rarely happen in practice. |
| |
| It'll work the following way: |
| |
| 1) gst_pad_connect(pad1,pad2) is called by something |
| 2) pad1's negotiate() method is called, with pad2 as argument |
| 3) negotiate() repeatedly calls pad2's set_caps() method |
| |
| At some point, the two pads will agree on a set of caps, and proceed by |
| returning TRUE from negotiate(), at which point gst_pad_connect() |
| finishes. If it returns FALSE, gst_pad_connect() is forced to fail. |
| |
| Now, obviously the algorithm used to find matching caps can get |
| complicated. But in some cases it'll be simple. Ideally, if there is no |
| negotiate() function for pad1, there'll be a function that will go through |
| the options and try to make pad1 and pad2 meet in the middle, with no |
| specific knowledge of what the caps actually mean. |
| |
| Another detail is deciding which pads are pad1 and pad2. In the autoplug |
| case, the code will sometimes know which of the pads have the more |
| specific caps. In others, you may not. Either you can guess, and |
| possibly lose to having the slower of the two pad's negotiate() methods do |
| the work, or you might be able to actually guess at which is the most |
| specific set of caps: |
| |
| For any given typeid in the union of both pads, look at all properties |
| For each property, find the smallest range, assign this a 1.0 |
| For all other instances of this property, assign relative to 1.0 |
| For each pad1,pad2 |
| Take the assigned value of every property, and multiply together |
| |
| Whichever value is lower between pad1 and pad2 is most likely to be the |
| most specific set of caps. The trick is implementing the above |
| efficiently, but on the surface there appear to be more than enough |
| potential optimizations. |