mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-08 18:39:54 +00:00
302 lines
9.2 KiB
Text
302 lines
9.2 KiB
Text
|
Ghostpads
|
||
|
---------
|
||
|
|
||
|
GhostPads are used to build complex compound elements out of
|
||
|
existing elements. They are used to expose internal element pads
|
||
|
on the complex element.
|
||
|
|
||
|
Some design requirements
|
||
|
|
||
|
- Must look like a real GstPad on both sides.
|
||
|
- target of Ghostpad must be changeable
|
||
|
|
||
|
|
||
|
* a GhostPad is implemented using a smaller GstProxyPad class:
|
||
|
|
||
|
|
||
|
GstProxyPad
|
||
|
(------------------)
|
||
|
| GstPad |
|
||
|
|------------------|
|
||
|
| GstPad *target |
|
||
|
(------------------)
|
||
|
|
||
|
|
||
|
GstGhostPad
|
||
|
(------------------) -\
|
||
|
| GstPad | |
|
||
|
|------------------| > GstProxyPad
|
||
|
| GstPad *target | |
|
||
|
|------------------| -/
|
||
|
| GstPad *internal |
|
||
|
(------------------)
|
||
|
|
||
|
|
||
|
Some use case follow with a description of how the datastructure
|
||
|
is modified.
|
||
|
|
||
|
|
||
|
* Creating a ghostpad with a target:
|
||
|
|
||
|
gst_ghost_pad_new (char *name, GstPad *target)
|
||
|
|
||
|
1) create new GstGhostPad X
|
||
|
2) X name set to @name
|
||
|
3) X direction is the same as the target
|
||
|
4) the target is set to @target
|
||
|
5) internal is NULL
|
||
|
6) link/unlink and activate functions are set up
|
||
|
on GstGhostPad.
|
||
|
|
||
|
|
||
|
(--------------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------------> | sink |
|
||
|
|------------| |------)
|
||
|
| internal *---->// (--------------
|
||
|
(------------)
|
||
|
|
||
|
- Automatically takes same direction as target.
|
||
|
- target is filled in automatically.
|
||
|
|
||
|
|
||
|
* Creating a ghostpad without a target
|
||
|
|
||
|
gst_ghost_pad_new_notarget (char *name, GstPadDirection dir)
|
||
|
|
||
|
1) create new GstGhostPad X
|
||
|
2) X name set to @name
|
||
|
3) X direction is @dir
|
||
|
4) internal is NULL
|
||
|
5) link/unlink and activate functions are set up
|
||
|
on GstGhostPad.
|
||
|
|
||
|
|
||
|
(- X --------)
|
||
|
| |
|
||
|
| target *------>//
|
||
|
|------------|
|
||
|
| internal *---->//
|
||
|
(------------)
|
||
|
|
||
|
- allows for setting the target later
|
||
|
|
||
|
|
||
|
* Setting target on an untargetted unlinked ghostpad
|
||
|
|
||
|
gst_ghost_pad_set_target (char *name, GstPad *newtarget)
|
||
|
|
||
|
(- X --------)
|
||
|
| |
|
||
|
| target *------>//
|
||
|
|------------|
|
||
|
| internal *---->//
|
||
|
(------------)
|
||
|
|
||
|
1) assert direction of newtarget == X direction
|
||
|
2) target is set to newtarget
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
|------------| |------)
|
||
|
| internal *--->// (--------
|
||
|
(------------)
|
||
|
|
||
|
|
||
|
* Setting target on an targetted unlinked ghostpad
|
||
|
|
||
|
gst_ghost_pad_set_target (char *name, GstPad *newtarget)
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
|------------| |------)
|
||
|
| internal *--->// (--------
|
||
|
(------------)
|
||
|
|
||
|
1) assert direction of newtarget == X direction
|
||
|
2) target is set to newtarget
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
|------------| |------)
|
||
|
| internal *--->// (--------
|
||
|
(------------)
|
||
|
|
||
|
|
||
|
* Linking a pad to an untargetted ghostpad:
|
||
|
|
||
|
gst_pad_link (src, X)
|
||
|
|
||
|
|
||
|
(- X --------)
|
||
|
| |
|
||
|
| target *------>//
|
||
|
|------------|
|
||
|
| internal *---->//
|
||
|
(------------)
|
||
|
-------)
|
||
|
|
|
||
|
(-----|
|
||
|
| src |
|
||
|
(-----|
|
||
|
-------)
|
||
|
|
||
|
|
||
|
1) link function is called
|
||
|
a) new GstProxyPad Y is created
|
||
|
b) Y direction is same as peer
|
||
|
c) Y target is set to peer
|
||
|
d) X internal pad is set to Y
|
||
|
e) Y is activated in the same mode as X
|
||
|
f) core makes link from src to X
|
||
|
|
||
|
|
||
|
(- X --------)
|
||
|
| |
|
||
|
| target *----->//
|
||
|
>|------------|
|
||
|
(real pad link) / | internal * |
|
||
|
/ (----------|-)
|
||
|
/ |
|
||
|
-------) / V
|
||
|
| / (- Y ------)
|
||
|
(-----|/ | |
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
|
||
|
* Linking a pad to a targetted ghostpad:
|
||
|
|
||
|
gst_pad_link (src, X)
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
|------------| |------)
|
||
|
| internal *--->// (--------
|
||
|
(------------)
|
||
|
-------)
|
||
|
|
|
||
|
(-----|
|
||
|
| src |
|
||
|
(-----|
|
||
|
-------)
|
||
|
|
||
|
|
||
|
1) link function is called
|
||
|
a) new GstProxyPad Y is created
|
||
|
b) Y direction is same as peer
|
||
|
c) Y target is set to peer
|
||
|
d) X internal pad is set to Y
|
||
|
e) link is made from Y to X target (sink)
|
||
|
f) Y is activated in the same mode as X
|
||
|
g) core makes link from src to X
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
>|------------| >|------)
|
||
|
(real pad link) / | internal * | / (--------
|
||
|
/ (----------|-) /
|
||
|
/ | /
|
||
|
-------) / V / (real pad link)
|
||
|
| / (- Y ------) /
|
||
|
(-----|/ | |/
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
|
||
|
* Setting target on untargetted linked ghostpad:
|
||
|
|
||
|
gst_ghost_pad_set_target (char *name, GstPad *newtarget)
|
||
|
|
||
|
|
||
|
(- X --------)
|
||
|
| |
|
||
|
| target *----->//
|
||
|
>|------------|
|
||
|
(real pad link) / | internal * |
|
||
|
/ (----------|-)
|
||
|
/ |
|
||
|
-------) / V
|
||
|
| / (- Y ------)
|
||
|
(-----|/ | |
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
1) assert direction of newtarget == X direction
|
||
|
2) X target is set to newtarget
|
||
|
3) Y (X internal) is linked to newtarget
|
||
|
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
>|------------| >|------)
|
||
|
(real pad link) / | internal * | / (--------
|
||
|
/ (----------|-) /
|
||
|
/ | /
|
||
|
-------) / V / (real pad link)
|
||
|
| / (- Y ------) /
|
||
|
(-----|/ | |/
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
|
||
|
* Setting target on targetted linked ghostpad:
|
||
|
|
||
|
gst_ghost_pad_set_target (char *name, GstPad *newtarget)
|
||
|
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
>|------------| >|------)
|
||
|
(real pad link) / | internal * | / (--------
|
||
|
/ (----------|-) /
|
||
|
/ | /
|
||
|
-------) / V / (real pad link)
|
||
|
| / (- Y ------) /
|
||
|
(-----|/ | |/
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
1) assert direction of newtarget == X direction
|
||
|
2) Y and X target are unlinked
|
||
|
2) X target is set to newtarget
|
||
|
3) Y (X internal) is linked to newtarget
|
||
|
|
||
|
|
||
|
(--------
|
||
|
(- X --------) |
|
||
|
| | |------)
|
||
|
| target *------------->| sink |
|
||
|
>|------------| >|------)
|
||
|
(real pad link) / | internal * | / (--------
|
||
|
/ (----------|-) /
|
||
|
/ | /
|
||
|
-------) / V / (real pad link)
|
||
|
| / (- Y ------) /
|
||
|
(-----|/ | |/
|
||
|
| src |<-------------* target |
|
||
|
(-----| (----------)
|
||
|
-------)
|
||
|
|
||
|
|