gstreamer/docs/random/wtay/capsnego-cases
Wim Taymans 3534e68563 Reworked the capsnegotiation function audiosink now uses capsnego to set its parameters mpg123/ac3dec use capsnego in...
Original commit message from CVS:
Reworked the capsnegotiation function
audiosink now uses capsnego to set its parameters
mpg123/ac3dec use capsnego instead of metadata
Added the beginnings of a testsuite for capsnego.
2001-03-18 02:42:30 +00:00

346 lines
4.3 KiB
Text

pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> ---
always compatible
--+ -> ---
call negotiate function, set the resulting caps
-+- -> ---
always compatible
-++ -> ---
call negotiate function, set the resulting caps
+-- -> ---
always compatible, caps are those of the pad
+-+ -> ---
always compatible, caps are those of the pad
++- -> ---
always compatible, caps are those of the pad
+++ -> ---
always compatible, caps are those of the pad
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> --+
call negotiate function, set the resulting caps
--+ -> --+
negotiate until agreed
-+- -> --+
call negotiate until caps match padtemplate
-++ -> --+
negotiate until agreed, caps only got send to the
other pad if they match the padtemplate
+-- -> --+
call negotiate function with src caps, set caps if ok
+-+ -> --+
call negotiate function with src caps, negotiate until agreed
++- -> --+
call negotiate function with src caps, set caps if ok
+++ -> --+
call negotiate function with src caps, negotiate until agreed
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> -+-
always compatible
--+ -> -+-
call negotiate until caps match padtemplate
-+- -> -+-
check padtemplates, if compatible connect
-++ -> -+-
check templates, if compatible,
call negotiate, until it matches the padtemplate
+-- -> -+-
check caps against padtemplate, if compatible, connect
+-+ -> -+-
check caps against padtemplate, if compatible: connect
alse call negotiate until it matches template
++- -> -+-
check caps against padtemplate, if match, connect
+++ -> -+-
check caps against padtemplate, if match, connect
alse check padtemplates if compatible,
call negotiate until match template
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> -++
call negotiate, set resulting caps
--+ -> -++
call negotiate until agree, check src caps against
padtemplate before calling sink negotiate
-+- -> -++
check padtemplates, if match call negotiate until
match src padtemplate.
-++ -> -++
check padtemplates, if match call negotiate until
agree
+-- -> -++
check caps against padtemplate
call negotiate with caps, if agree, set caps
+-+ -> -++
check caps against padtemplate
call negotiate with caps, negotiate until agree
++- -> -++
check caps against padtemplate
call negotiate with caps, call negotiate until
sink caps match src padtemplate
+++ -> -++
check caps against padtemplate
call negotiate with caps, negotiate until agree
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> +--
connection fails
--+ -> +--
-+- -> +--
-++ -> +--
+-- -> +--
+-+ -> +--
++- -> +--
+++ -> +--
check caps,
call src negotiate with caps
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> +-+
--+ -> +-+
-+- -> +-+
-++ -> +-+
+-- -> +-+
+-+ -> +-+
++- -> +-+
+++ -> +-+
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> ++-
--+ -> ++-
-+- -> ++-
-++ -> ++-
+-- -> ++-
+-+ -> ++-
++- -> ++-
+++ -> ++-
=====================================
pad has caps
| pad has template
|/ pad has negotiate function
||/
--- -> +++
--+ -> +++
-+- -> +++
-++ -> +++
+-- -> +++
+-+ -> +++
++- -> +++
+++ -> +++
=====================================
srccaps = GST_PAD_CAPS (srcpad);
srctempl = FALSE;
do {
//no caps, get one
if (!srccaps)
{
if (srcpad->negotiatefunc && !srctempl)
{
srccaps = srcpad->negotiatefunc (srpad, srcaps, counter);
srctempl = FALSE;
}
else
{
srccaps = gst_pad_get_caps (srcpad);
srctempl = TRUE;
}
}
/* check against other pad */
// the other pad doesn't want to negotiate
if (!sinkpad->negotiatefunc)
{
sinkcaps = gst_pad_get_caps (sinkpad);
if (!sinkcaps)
break;
if (gst_caps_check_compatibility (srccaps, sinkcaps))
{
// cool
break;
}
}
else {
switch pads;
}
} while (counter < 100);