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.