[gst-devel] RFC: Pad capabilities negotiation

Erik Walthinsen omega at cse.ogi.edu
Wed Dec 13 11:25:31 CET 2000

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.

         Erik Walthinsen <omega at cse.ogi.edu> - Staff Programmer @ OGI
        Quasar project - http://www.cse.ogi.edu/DISC/projects/quasar/
   Video4Linux Two drivers and stuff - http://www.cse.ogi.edu/~omega/v4l2/
       /  \             SEUL: Simple End-User Linux - http://www.seul.org/
      |    | M E G A           Helping Linux become THE choice
      _\  /_                          for the home or office user

More information about the gstreamer-devel mailing list