Replace the switch plugin with the selector plugin. Add output- selector as the opposite of input-selectoo (was switc...

Original commit message from CVS:
* configure.ac:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/gst-plugins-bad-plugins.args:
* docs/plugins/gst-plugins-bad-plugins.hierarchy:
* docs/plugins/gst-plugins-bad-plugins.interfaces:
* docs/plugins/gst-plugins-bad-plugins.signals:
* docs/plugins/inspect/plugin-metadata.xml:
* docs/plugins/inspect/plugin-selector.xml:
* docs/plugins/inspect/plugin-soundtouch.xml:
* docs/plugins/inspect/plugin-switch.xml:
* gst/selector/.cvsignore:
* gst/selector/Makefile.am:
* gst/selector/gstinputselector.c:
* gst/selector/gstinputselector.h:
* gst/selector/gstoutputselector.c:
* gst/selector/gstoutputselector.h:
* gst/selector/gstselector-marshal.list:
* gst/selector/gstselector.c:
* gst/selector/selector.vcproj:
* gst/switch/.cvsignore:
* gst/switch/Makefile.am:
* gst/switch/gstswitch-marshal.list:
* gst/switch/gstswitch.c:
* gst/switch/gstswitch.h:
* gst/switch/switch.vcproj:
* tests/icles/.cvsignore:
* tests/icles/Makefile.am:
* tests/icles/output-selector-test.c:
Replace the switch plugin with the selector plugin. Add output-
selector as the opposite of input-selectoo (was switch). Add a test
for output-selector. Add docs for the elements. The vcproj needs
update. Fixes #500142.
This commit is contained in:
Stefan Kost 2008-01-29 07:38:31 +00:00
parent c459b9da7d
commit 83e305cf5d
27 changed files with 1207 additions and 330 deletions

View file

@ -1,3 +1,40 @@
2008-01-29 Stefan Kost <ensonic@users.sf.net>
* configure.ac:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/gst-plugins-bad-plugins.args:
* docs/plugins/gst-plugins-bad-plugins.hierarchy:
* docs/plugins/gst-plugins-bad-plugins.interfaces:
* docs/plugins/gst-plugins-bad-plugins.signals:
* docs/plugins/inspect/plugin-metadata.xml:
* docs/plugins/inspect/plugin-selector.xml:
* docs/plugins/inspect/plugin-soundtouch.xml:
* docs/plugins/inspect/plugin-switch.xml:
* gst/selector/.cvsignore:
* gst/selector/Makefile.am:
* gst/selector/gstinputselector.c:
* gst/selector/gstinputselector.h:
* gst/selector/gstoutputselector.c:
* gst/selector/gstoutputselector.h:
* gst/selector/gstselector-marshal.list:
* gst/selector/gstselector.c:
* gst/selector/selector.vcproj:
* gst/switch/.cvsignore:
* gst/switch/Makefile.am:
* gst/switch/gstswitch-marshal.list:
* gst/switch/gstswitch.c:
* gst/switch/gstswitch.h:
* gst/switch/switch.vcproj:
* tests/icles/.cvsignore:
* tests/icles/Makefile.am:
* tests/icles/output-selector-test.c:
Replace the switch plugin with the selector plugin. Add output-
selector as the opposite of input-selectoo (was switch). Add a test
for output-selector. Add docs for the elements. The vcproj needs
update. Fixes #500142.
2008-01-28 Tim-Philipp Müller <tim at centricular dot net> 2008-01-28 Tim-Philipp Müller <tim at centricular dot net>
* gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_forward): * gst/h264parse/gsth264parse.c: (gst_h264_parse_chain_forward):

View file

@ -105,11 +105,11 @@ GST_PLUGINS_ALL="\
replaygain \ replaygain \
rtpmanager \ rtpmanager \
sdp \ sdp \
selector \
spectrum \ spectrum \
speexresample \ speexresample \
speed \ speed \
stereo \ stereo \
switch \
tta \ tta \
videosignal \ videosignal \
vmnc \ vmnc \
@ -1116,11 +1116,11 @@ gst/rawparse/Makefile
gst/replaygain/Makefile gst/replaygain/Makefile
gst/rtpmanager/Makefile gst/rtpmanager/Makefile
gst/sdp/Makefile gst/sdp/Makefile
gst/selector/Makefile
gst/spectrum/Makefile gst/spectrum/Makefile
gst/speed/Makefile gst/speed/Makefile
gst/speexresample/Makefile gst/speexresample/Makefile
gst/stereo/Makefile gst/stereo/Makefile
gst/switch/Makefile
gst/tta/Makefile gst/tta/Makefile
gst/videosignal/Makefile gst/videosignal/Makefile
gst/vmnc/Makefile gst/vmnc/Makefile

View file

@ -116,6 +116,7 @@ EXTRA_HFILES = \
$(top_srcdir)/ext/timidity/gsttimidity.h \ $(top_srcdir)/ext/timidity/gsttimidity.h \
$(top_srcdir)/ext/timidity/gstwildmidi.h \ $(top_srcdir)/ext/timidity/gstwildmidi.h \
$(top_srcdir)/gst/dvdspu/gstdvdspu.h \ $(top_srcdir)/gst/dvdspu/gstdvdspu.h \
$(top_srcdir)/gst/equalizer/gstiirequalizer.h \
$(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer3bands.h \
$(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizer10bands.h \
$(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \ $(top_srcdir)/gst/equalizer/gstiirequalizernbands.h \
@ -138,6 +139,8 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/rtpmanager/gstrtpsession.h \ $(top_srcdir)/gst/rtpmanager/gstrtpsession.h \
$(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \ $(top_srcdir)/gst/rtpmanager/gstrtpssrcdemux.h \
$(top_srcdir)/gst/sdp/gstsdpdemux.h \ $(top_srcdir)/gst/sdp/gstsdpdemux.h \
$(top_srcdir)/gst/selector/gstinputselector.h \
$(top_srcdir)/gst/selector/gstoutputselector.h \
$(top_srcdir)/gst/spectrum/gstspectrum.h \ $(top_srcdir)/gst/spectrum/gstspectrum.h \
$(top_srcdir)/gst/speed/gstspeed.h \ $(top_srcdir)/gst/speed/gstspeed.h \
$(top_srcdir)/gst/speexresample/gstspeexresample.h \ $(top_srcdir)/gst/speexresample/gstspeexresample.h \

View file

@ -35,6 +35,7 @@
<xi:include href="xml/element-gstrtpptdemux.xml" /> <xi:include href="xml/element-gstrtpptdemux.xml" />
<xi:include href="xml/element-gstrtpsession.xml" /> <xi:include href="xml/element-gstrtpsession.xml" />
<xi:include href="xml/element-gstrtpssrcdemux.xml" /> <xi:include href="xml/element-gstrtpssrcdemux.xml" />
<xi:include href="xml/element-input-selector.xml" />
<xi:include href="xml/element-ivorbisdec.xml" /> <xi:include href="xml/element-ivorbisdec.xml" />
<xi:include href="xml/element-jackaudiosink.xml" /> <xi:include href="xml/element-jackaudiosink.xml" />
<xi:include href="xml/element-lpwsinc.xml" /> <xi:include href="xml/element-lpwsinc.xml" />
@ -45,6 +46,7 @@
<xi:include href="xml/element-multifilesrc.xml" /> <xi:include href="xml/element-multifilesrc.xml" />
<!--xi:include href="xml/element-mythtvsrc.xml" /--> <!--xi:include href="xml/element-mythtvsrc.xml" /-->
<xi:include href="xml/element-nuvdemux.xml" /> <xi:include href="xml/element-nuvdemux.xml" />
<xi:include href="xml/element-output-selector.xml" />
<xi:include href="xml/element-rganalysis.xml" /> <xi:include href="xml/element-rganalysis.xml" />
<xi:include href="xml/element-rglimiter.xml" /> <xi:include href="xml/element-rglimiter.xml" />
<xi:include href="xml/element-rgvolume.xml" /> <xi:include href="xml/element-rgvolume.xml" />
@ -118,6 +120,7 @@
<xi:include href="xml/plugin-rfbsrc.xml" /> <xi:include href="xml/plugin-rfbsrc.xml" />
<xi:include href="xml/plugin-sdl.xml" /> <xi:include href="xml/plugin-sdl.xml" />
<xi:include href="xml/plugin-sdp.xml" /> <xi:include href="xml/plugin-sdp.xml" />
<xi:include href="xml/plugin-selector.xml" />
<xi:include href="xml/plugin-sndfile.xml" /> <xi:include href="xml/plugin-sndfile.xml" />
<xi:include href="xml/plugin-soundtouch.xml" /> <xi:include href="xml/plugin-soundtouch.xml" />
<xi:include href="xml/plugin-soup.xml" /> <xi:include href="xml/plugin-soup.xml" />
@ -127,7 +130,6 @@
<xi:include href="xml/plugin-speexresample.xml" /> <xi:include href="xml/plugin-speexresample.xml" />
<xi:include href="xml/plugin-stereo.xml" /> <xi:include href="xml/plugin-stereo.xml" />
<xi:include href="xml/plugin-swfdec.xml" /> <xi:include href="xml/plugin-swfdec.xml" />
<xi:include href="xml/plugin-switch.xml" />
<xi:include href="xml/plugin-timidity.xml" /> <xi:include href="xml/plugin-timidity.xml" />
<xi:include href="xml/plugin-tremor.xml" /> <xi:include href="xml/plugin-tremor.xml" />
<xi:include href="xml/plugin-tta.xml" /> <xi:include href="xml/plugin-tta.xml" />

View file

@ -282,6 +282,20 @@ GST_TYPE_LPWSINC
gst_lpwsinc_get_type gst_lpwsinc_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>element-input-selector</FILE>
<TITLE>input-selector</TITLE>
GstInputSelector
<SUBSECTION Standard>
GstInputSelectorClass
GST_INPUT_SELECTOR
GST_INPUT_SELECTOR_CLASS
GST_IS_INPUT_SELECTOR
GST_IS_INPUT_SELECTOR_CLASS
GST_TYPE_INPUT_SELECTOR
gst_input_selector_get_type
</SECTION>
<SECTION> <SECTION>
<FILE>element-ivorbisdec</FILE> <FILE>element-ivorbisdec</FILE>
<TITLE>ivorbisdec</TITLE> <TITLE>ivorbisdec</TITLE>
@ -412,6 +426,20 @@ GST_TYPE_NUV_DEMUX
gst_nuv_demux_get_type gst_nuv_demux_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>element-output-selector</FILE>
<TITLE>output-selector</TITLE>
GstOutputSelector
<SUBSECTION Standard>
GstOutputSelectorClass
GST_OUTPUT_SELECTOR
GST_OUTPUT_SELECTOR_CLASS
GST_IS_OUTPUT_SELECTOR
GST_IS_OUTPUT_SELECTOR_CLASS
GST_TYPE_OUTPUT_SELECTOR
gst_output_selector_get_type
</SECTION>
<SECTION> <SECTION>
<FILE>element-rganalysis</FILE> <FILE>element-rganalysis</FILE>
<TITLE>rganalysis</TITLE> <TITLE>rganalysis</TITLE>

View file

@ -11,7 +11,7 @@
<ARG> <ARG>
<NAME>GstPitch::pitch</NAME> <NAME>GstPitch::pitch</NAME>
<TYPE>gfloat</TYPE> <TYPE>gfloat</TYPE>
<RANGE>[0.1,10]</RANGE> <RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Pitch</NICK> <NICK>Pitch</NICK>
<BLURB>Audio stream pitch.</BLURB> <BLURB>Audio stream pitch.</BLURB>
@ -21,7 +21,7 @@
<ARG> <ARG>
<NAME>GstPitch::rate</NAME> <NAME>GstPitch::rate</NAME>
<TYPE>gfloat</TYPE> <TYPE>gfloat</TYPE>
<RANGE>[0.1,10]</RANGE> <RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Rate</NICK> <NICK>Rate</NICK>
<BLURB>Audio stream rate.</BLURB> <BLURB>Audio stream rate.</BLURB>
@ -31,7 +31,7 @@
<ARG> <ARG>
<NAME>GstPitch::tempo</NAME> <NAME>GstPitch::tempo</NAME>
<TYPE>gfloat</TYPE> <TYPE>gfloat</TYPE>
<RANGE>[0.1,10]</RANGE> <RANGE>[0,1,10]</RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Tempo</NICK> <NICK>Tempo</NICK>
<BLURB>Audio stream tempo.</BLURB> <BLURB>Audio stream tempo.</BLURB>
@ -430,7 +430,7 @@
<ARG> <ARG>
<NAME>GstXvidEnc::statsfile</NAME> <NAME>GstXvidEnc::statsfile</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Statistics Filename</NICK> <NICK>Statistics Filename</NICK>
@ -530,7 +530,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::location</NAME> <NAME>GstNeonhttpSrc::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Location</NICK> <NICK>Location</NICK>
@ -540,7 +540,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::proxy</NAME> <NAME>GstNeonhttpSrc::proxy</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Proxy</NICK> <NICK>Proxy</NICK>
@ -570,7 +570,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::iradio-genre</NAME> <NAME>GstNeonhttpSrc::iradio-genre</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>iradio-genre</NICK> <NICK>iradio-genre</NICK>
@ -590,7 +590,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::iradio-name</NAME> <NAME>GstNeonhttpSrc::iradio-name</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>iradio-name</NICK> <NICK>iradio-name</NICK>
@ -600,7 +600,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::iradio-url</NAME> <NAME>GstNeonhttpSrc::iradio-url</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>iradio-url</NICK> <NICK>iradio-url</NICK>
@ -620,7 +620,7 @@
<ARG> <ARG>
<NAME>GstNeonhttpSrc::user-agent</NAME> <NAME>GstNeonhttpSrc::user-agent</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>User-Agent</NICK> <NICK>User-Agent</NICK>
@ -630,7 +630,7 @@
<ARG> <ARG>
<NAME>GstTRM::proxy-address</NAME> <NAME>GstTRM::proxy-address</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>proxy address</NICK> <NICK>proxy address</NICK>
@ -1030,7 +1030,7 @@
<ARG> <ARG>
<NAME>GstMMS::location</NAME> <NAME>GstMMS::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>location</NICK> <NICK>location</NICK>
@ -1190,7 +1190,7 @@
<ARG> <ARG>
<NAME>GstGLImageSink::display</NAME> <NAME>GstGLImageSink::display</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Display</NICK> <NICK>Display</NICK>
@ -1480,7 +1480,7 @@
<ARG> <ARG>
<NAME>GstModPlug::songname</NAME> <NAME>GstModPlug::songname</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>Songname</NICK> <NICK>Songname</NICK>
@ -1670,7 +1670,7 @@
<ARG> <ARG>
<NAME>GstJackAudioSink::server</NAME> <NAME>GstJackAudioSink::server</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Server</NICK> <NICK>Server</NICK>
@ -1780,7 +1780,7 @@
<ARG> <ARG>
<NAME>GstDvbSrc::pids</NAME> <NAME>GstDvbSrc::pids</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>w</FLAGS> <FLAGS>w</FLAGS>
<NICK>pids</NICK> <NICK>pids</NICK>
@ -1870,7 +1870,7 @@
<ARG> <ARG>
<NAME>GstDvbSrc::polarity</NAME> <NAME>GstDvbSrc::polarity</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>polarity</NICK> <NICK>polarity</NICK>
@ -1900,7 +1900,7 @@
<ARG> <ARG>
<NAME>GstMultiFileSink::location</NAME> <NAME>GstMultiFileSink::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>File Location</NICK> <NICK>File Location</NICK>
@ -1920,7 +1920,7 @@
<ARG> <ARG>
<NAME>GstMultiFileSrc::caps</NAME> <NAME>GstMultiFileSrc::caps</NAME>
<TYPE>GstCaps</TYPE> <TYPE>GstCaps*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Caps</NICK> <NICK>Caps</NICK>
@ -1940,7 +1940,7 @@
<ARG> <ARG>
<NAME>GstMultiFileSrc::location</NAME> <NAME>GstMultiFileSrc::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>File Location</NICK> <NICK>File Location</NICK>
@ -1950,7 +1950,7 @@
<ARG> <ARG>
<NAME>GstRfbSrc::host</NAME> <NAME>GstRfbSrc::host</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Host to connect to</NICK> <NICK>Host to connect to</NICK>
@ -1970,7 +1970,7 @@
<ARG> <ARG>
<NAME>GstRfbSrc::password</NAME> <NAME>GstRfbSrc::password</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>w</FLAGS> <FLAGS>w</FLAGS>
<NICK>Password for authentication</NICK> <NICK>Password for authentication</NICK>
@ -1980,7 +1980,7 @@
<ARG> <ARG>
<NAME>GstRfbSrc::version</NAME> <NAME>GstRfbSrc::version</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>RFB protocol version</NICK> <NICK>RFB protocol version</NICK>
@ -17050,7 +17050,7 @@
<ARG> <ARG>
<NAME>GstCDAudio::device</NAME> <NAME>GstCDAudio::device</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Device</NICK> <NICK>Device</NICK>
@ -17220,7 +17220,7 @@
<ARG> <ARG>
<NAME>GstX264Enc::stats-file</NAME> <NAME>GstX264Enc::stats-file</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Stats File</NICK> <NICK>Stats File</NICK>
@ -17580,7 +17580,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::password</NAME> <NAME>GstRealAudioDec::password</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Password</NICK> <NICK>Password</NICK>
@ -17640,7 +17640,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::ra14-4-names</NAME> <NAME>GstRealAudioDec::ra14-4-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of 14_4 driver</NICK> <NICK>Names of 14_4 driver</NICK>
@ -17650,7 +17650,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::ra28-8-names</NAME> <NAME>GstRealAudioDec::ra28-8-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of 28_8 driver</NICK> <NICK>Names of 28_8 driver</NICK>
@ -17660,7 +17660,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::raatrk-names</NAME> <NAME>GstRealAudioDec::raatrk-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of atrk driver</NICK> <NICK>Names of atrk driver</NICK>
@ -17670,7 +17670,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::racook-names</NAME> <NAME>GstRealAudioDec::racook-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of cook driver</NICK> <NICK>Names of cook driver</NICK>
@ -17680,7 +17680,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::rasipr-names</NAME> <NAME>GstRealAudioDec::rasipr-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of sipr driver</NICK> <NICK>Names of sipr driver</NICK>
@ -17690,7 +17690,7 @@
<ARG> <ARG>
<NAME>GstRealAudioDec::real-codecs-path</NAME> <NAME>GstRealAudioDec::real-codecs-path</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Path where to search for RealPlayer codecs</NICK> <NICK>Path where to search for RealPlayer codecs</NICK>
@ -17730,7 +17730,7 @@
<ARG> <ARG>
<NAME>GstRealVideoDec::real-codecs-path</NAME> <NAME>GstRealVideoDec::real-codecs-path</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Path where to search for RealPlayer codecs</NICK> <NICK>Path where to search for RealPlayer codecs</NICK>
@ -17740,7 +17740,7 @@
<ARG> <ARG>
<NAME>GstRealVideoDec::rv20-names</NAME> <NAME>GstRealVideoDec::rv20-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of rv20 driver</NICK> <NICK>Names of rv20 driver</NICK>
@ -17750,7 +17750,7 @@
<ARG> <ARG>
<NAME>GstRealVideoDec::rv30-names</NAME> <NAME>GstRealVideoDec::rv30-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of rv30 driver</NICK> <NICK>Names of rv30 driver</NICK>
@ -17760,7 +17760,7 @@
<ARG> <ARG>
<NAME>GstRealVideoDec::rv40-names</NAME> <NAME>GstRealVideoDec::rv40-names</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Names of rv40 driver</NICK> <NICK>Names of rv40 driver</NICK>
@ -17830,7 +17830,7 @@
<ARG> <ARG>
<NAME>GstSFSrc::location</NAME> <NAME>GstSFSrc::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>File Location</NICK> <NICK>File Location</NICK>
@ -17850,7 +17850,7 @@
<ARG> <ARG>
<NAME>GstSFSink::location</NAME> <NAME>GstSFSink::location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>File Location</NICK> <NICK>File Location</NICK>
@ -17880,7 +17880,7 @@
<ARG> <ARG>
<NAME>GstSwitch::active-pad</NAME> <NAME>GstSwitch::active-pad</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Active pad</NICK> <NICK>Active pad</NICK>
@ -18210,7 +18210,7 @@
<ARG> <ARG>
<NAME>GstVCDSrc::device</NAME> <NAME>GstVCDSrc::device</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Device</NICK> <NICK>Device</NICK>
@ -18270,7 +18270,7 @@
<ARG> <ARG>
<NAME>MpegTSParse::program-numbers</NAME> <NAME>MpegTSParse::program-numbers</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Program Numbers</NICK> <NICK>Program Numbers</NICK>
@ -18280,7 +18280,7 @@
<ARG> <ARG>
<NAME>GstAppSink::caps</NAME> <NAME>GstAppSink::caps</NAME>
<TYPE>GstCaps</TYPE> <TYPE>GstCaps*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Caps</NICK> <NICK>Caps</NICK>
@ -18350,7 +18350,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-cname</NAME> <NAME>GstRtpSession::sdes-cname</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES CNAME</NICK> <NICK>SDES CNAME</NICK>
@ -18360,7 +18360,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-email</NAME> <NAME>GstRtpSession::sdes-email</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES EMAIL</NICK> <NICK>SDES EMAIL</NICK>
@ -18370,7 +18370,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-location</NAME> <NAME>GstRtpSession::sdes-location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES LOCATION</NICK> <NICK>SDES LOCATION</NICK>
@ -18380,7 +18380,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-name</NAME> <NAME>GstRtpSession::sdes-name</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES NAME</NICK> <NICK>SDES NAME</NICK>
@ -18390,7 +18390,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-note</NAME> <NAME>GstRtpSession::sdes-note</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES NOTE</NICK> <NICK>SDES NOTE</NICK>
@ -18400,7 +18400,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-phone</NAME> <NAME>GstRtpSession::sdes-phone</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES PHONE</NICK> <NICK>SDES PHONE</NICK>
@ -18410,7 +18410,7 @@
<ARG> <ARG>
<NAME>GstRtpSession::sdes-tool</NAME> <NAME>GstRtpSession::sdes-tool</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES TOOL</NICK> <NICK>SDES TOOL</NICK>
@ -18460,7 +18460,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-cname</NAME> <NAME>GstRtpBin::sdes-cname</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES CNAME</NICK> <NICK>SDES CNAME</NICK>
@ -18470,7 +18470,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-email</NAME> <NAME>GstRtpBin::sdes-email</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES EMAIL</NICK> <NICK>SDES EMAIL</NICK>
@ -18480,7 +18480,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-location</NAME> <NAME>GstRtpBin::sdes-location</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES LOCATION</NICK> <NICK>SDES LOCATION</NICK>
@ -18490,7 +18490,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-name</NAME> <NAME>GstRtpBin::sdes-name</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES NAME</NICK> <NICK>SDES NAME</NICK>
@ -18500,7 +18500,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-note</NAME> <NAME>GstRtpBin::sdes-note</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES NOTE</NICK> <NICK>SDES NOTE</NICK>
@ -18510,7 +18510,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-phone</NAME> <NAME>GstRtpBin::sdes-phone</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES PHONE</NICK> <NICK>SDES PHONE</NICK>
@ -18520,7 +18520,7 @@
<ARG> <ARG>
<NAME>GstRtpBin::sdes-tool</NAME> <NAME>GstRtpBin::sdes-tool</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>SDES TOOL</NICK> <NICK>SDES TOOL</NICK>
@ -18680,7 +18680,7 @@
<ARG> <ARG>
<NAME>DvbBaseBin::polarity</NAME> <NAME>DvbBaseBin::polarity</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>polarity</NICK> <NICK>polarity</NICK>
@ -18690,7 +18690,7 @@
<ARG> <ARG>
<NAME>DvbBaseBin::program-numbers</NAME> <NAME>DvbBaseBin::program-numbers</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>Program Numbers</NICK> <NICK>Program Numbers</NICK>
@ -19100,7 +19100,7 @@
<ARG> <ARG>
<NAME>GstFBDEVSink::device</NAME> <NAME>GstFBDEVSink::device</NAME>
<TYPE>gchararray</TYPE> <TYPE>gchar*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>rw</FLAGS> <FLAGS>rw</FLAGS>
<NICK>device</NICK> <NICK>device</NICK>
@ -19120,7 +19120,7 @@
<ARG> <ARG>
<NAME>Ivorbisfile::metadata</NAME> <NAME>Ivorbisfile::metadata</NAME>
<TYPE>GstCaps</TYPE> <TYPE>GstCaps*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>Metadata</NICK> <NICK>Metadata</NICK>
@ -19130,7 +19130,7 @@
<ARG> <ARG>
<NAME>Ivorbisfile::streaminfo</NAME> <NAME>Ivorbisfile::streaminfo</NAME>
<TYPE>GstCaps</TYPE> <TYPE>GstCaps*</TYPE>
<RANGE></RANGE> <RANGE></RANGE>
<FLAGS>r</FLAGS> <FLAGS>r</FLAGS>
<NICK>stream</NICK> <NICK>stream</NICK>
@ -19223,3 +19223,33 @@
<DEFAULT>26</DEFAULT> <DEFAULT>26</DEFAULT>
</ARG> </ARG>
<ARG>
<NAME>GstInputSelector::active-pad</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Active pad</NICK>
<BLURB>Name of the currently active sink pad.</BLURB>
<DEFAULT>NULL</DEFAULT>
</ARG>
<ARG>
<NAME>GstOutputSelector::active-pad</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Active pad</NICK>
<BLURB>Name of the currently active src pad.</BLURB>
<DEFAULT>NULL</DEFAULT>
</ARG>
<ARG>
<NAME>GstOutputSelector::resend-latest</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Resend latest buffer</NICK>
<BLURB>Resend latest buffer after a switch to a new pad.</BLURB>
<DEFAULT>FALSE</DEFAULT>
</ARG>

View file

@ -255,6 +255,29 @@ GObject
ladspa-imp ladspa-imp
GstXvidEnc GstXvidEnc
GstXvidDec GstXvidDec
GstPitch
GstBaseTransform
GstAudioFilter
GstBPMDetect
GstStereo
GstSpectrum
GstLPWSinc
GstBPWSinc
GstIirEqualizer
GstIirEqualizerNBands
GstIirEqualizer3Bands
GstIirEqualizer10Bands
GstSpeexResample
GstVideoFilter
GstVideoAnalyse
GstVideoDetect
GstVideoMark
GstRgAnalysis
GstRgLimiter
GstVideoCrop
GstBayer2RGB
GstIIR
GstDeinterlace
GstBaseSink GstBaseSink
GstSFSink GstSFSink
GstVideoSink GstVideoSink
@ -294,27 +317,6 @@ GObject
GstAmrwbDec GstAmrwbDec
GstAmrwbParse GstAmrwbParse
GstAmrwbEnc GstAmrwbEnc
GstBaseTransform
GstSpeexResample
GstVideoFilter
GstVideoAnalyse
GstVideoDetect
GstVideoMark
GstRgAnalysis
GstRgLimiter
GstVideoCrop
GstAudioFilter
GstStereo
GstSpectrum
GstLPWSinc
GstBPWSinc
GstIirEqualizer
GstIirEqualizerNBands
GstIirEqualizer3Bands
GstIirEqualizer10Bands
GstBayer2RGB
GstIIR
GstDeinterlace
MpegTSParse MpegTSParse
GstRawParse GstRawParse
GstVideoParse GstVideoParse
@ -341,6 +343,8 @@ GObject
GstSpeed GstSpeed
GstNsfDec GstNsfDec
GstDVDSpu GstDVDSpu
GstInputSelector
GstOutputSelector
GstModPlug GstModPlug
GstH264Parse GstH264Parse
GstFLVDemux GstFLVDemux

View file

@ -6,13 +6,13 @@ GstRtpClient GstChildProxy
GstRgVolume GstChildProxy GstRgVolume GstChildProxy
GstSDPDemux GstChildProxy GstSDPDemux GstChildProxy
GstMetadataMux GstTagSetter GstMetadataMux GstTagSetter
GstIirEqualizer GstChildProxy
GstIirEqualizerNBands GstChildProxy
GstIirEqualizer3Bands GstChildProxy
GstIirEqualizer10Bands GstChildProxy
GstSDLVideoSink GstImplementsInterface GstXOverlay GstNavigation GstSDLVideoSink GstImplementsInterface GstXOverlay GstNavigation
GstGLImageSink GstImplementsInterface GstXOverlay GstGLImageSink GstImplementsInterface GstXOverlay
GstNeonhttpSrc GstURIHandler GstNeonhttpSrc GstURIHandler
GstMMS GstURIHandler GstMMS GstURIHandler
GstVCDSrc GstURIHandler GstVCDSrc GstURIHandler
GstCDAudio GstURIHandler GstCDAudio GstURIHandler
GstIirEqualizer GstChildProxy
GstIirEqualizerNBands GstChildProxy
GstIirEqualizer3Bands GstChildProxy
GstIirEqualizer10Bands GstChildProxy

View file

@ -281,3 +281,20 @@ GstCDAudio *gstcdaudio
gint arg1 gint arg1
</SIGNAL> </SIGNAL>
<SIGNAL>
<NAME>GstInputSelector::block</NAME>
<RETURNS>gint64</RETURNS>
<FLAGS>l</FLAGS>
GstInputSelector *gstinputselector
</SIGNAL>
<SIGNAL>
<NAME>GstInputSelector::switch</NAME>
<RETURNS>void</RETURNS>
<FLAGS>l</FLAGS>
GstInputSelector *gstinputselector
gchar *arg1
gint64 arg2
gint64 arg3
</SIGNAL>

View file

@ -16,18 +16,18 @@
<description>Send metadata tags (EXIF, IPTC and XMP) and remove metadata chunks from stream</description> <description>Send metadata tags (EXIF, IPTC and XMP) and remove metadata chunks from stream</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author> <author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads> <pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>image/jpeg, tags-extracted=(boolean)true; image/png, tags-extracted=(boolean)true</details>
</caps>
<caps> <caps>
<name>sink</name> <name>sink</name>
<direction>sink</direction> <direction>sink</direction>
<presence>always</presence> <presence>always</presence>
<details>image/jpeg, tags-extracted=(boolean)false; image/png, tags-extracted=(boolean)false</details> <details>image/jpeg, tags-extracted=(boolean)false; image/png, tags-extracted=(boolean)false</details>
</caps> </caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>image/jpeg, tags-extracted=(boolean)true; image/png, tags-extracted=(boolean)true</details>
</caps>
</pads> </pads>
</element> </element>
<element> <element>
@ -37,18 +37,18 @@
<description>Write metadata (EXIF, IPTC and XMP) into a image stream</description> <description>Write metadata (EXIF, IPTC and XMP) into a image stream</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author> <author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads> <pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>image/jpeg; image/png</details>
</caps>
<caps> <caps>
<name>sink</name> <name>sink</name>
<direction>sink</direction> <direction>sink</direction>
<presence>always</presence> <presence>always</presence>
<details>image/jpeg, tags-extracted=(boolean)true; image/png, tags-extracted=(boolean)true</details> <details>image/jpeg, tags-extracted=(boolean)true; image/png, tags-extracted=(boolean)true</details>
</caps> </caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>image/jpeg; image/png</details>
</caps>
</pads> </pads>
</element> </element>
</elements> </elements>

View file

@ -0,0 +1,55 @@
<plugin>
<name>selector</name>
<description>input/output stream selector elements</description>
<filename>../../gst/selector/.libs/libgstselector.so</filename>
<basename>libgstselector.so</basename>
<version>0.10.5.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins CVS/prerelease</package>
<origin>Unknown package origin</origin>
<elements>
<element>
<name>input-selector</name>
<longname>Input selector</longname>
<class>Generic</class>
<description>N-to-1 input stream selectoring</description>
<author>Julien Moutte &lt;julien@moutte.net&gt;012Ronald S. Bultje &lt;rbultje@ronald.bitfreak.net&gt;012Jan Schmidt &lt;thaytan@mad.scientist.com&gt;012Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>ANY</details>
</caps>
<caps>
<name>sink%d</name>
<direction>sink</direction>
<presence>request</presence>
<details>ANY</details>
</caps>
</pads>
</element>
<element>
<name>output-selector</name>
<longname>Output selector</longname>
<class>Generic</class>
<description>1-to-N output stream selectoring</description>
<author>Stefan Kost &lt;stefan.kost@nokia.com&gt;</author>
<pads>
<caps>
<name>src%d</name>
<direction>source</direction>
<presence>request</presence>
<details>ANY</details>
</caps>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>ANY</details>
</caps>
</pads>
</element>
</elements>
</plugin>

View file

@ -1,14 +1,35 @@
<plugin> <plugin>
<name>soundtouch</name> <name>soundtouch</name>
<description>Audio Pitch Controller</description> <description>Audio Pitch Controller &amp; BPM Detection</description>
<filename>../../ext/soundtouch/.libs/libgstpitch.so</filename> <filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
<basename>libgstpitch.so</basename> <basename>libgstsoundtouch.so</basename>
<version>0.10.5.1</version> <version>0.10.5.1</version>
<license>LGPL</license> <license>LGPL</license>
<source>gst-plugins-bad</source> <source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins CVS/prerelease</package> <package>GStreamer Bad Plug-ins CVS/prerelease</package>
<origin>Unknown package origin</origin> <origin>Unknown package origin</origin>
<elements> <elements>
<element>
<name>bpmdetect</name>
<longname>BPM Detector</longname>
<class>Filter/Analyzer/Audio</class>
<description>Detect the BPM of an audio stream</description>
<author>Sebastian Dr303266ge &lt;slomo@circular-chaos.org&gt;</author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 8000, 2147483647 ], channels=(int)[ 1, 2 ]</details>
</caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>audio/x-raw-float, width=(int)32, endianness=(int)1234, rate=(int)[ 8000, 2147483647 ], channels=(int)[ 1, 2 ]</details>
</caps>
</pads>
</element>
<element> <element>
<name>pitch</name> <name>pitch</name>
<longname>Pitch controller</longname> <longname>Pitch controller</longname>
@ -16,17 +37,17 @@
<description>Control the pitch of an audio stream</description> <description>Control the pitch of an audio stream</description>
<author>Wouter Paesen &lt;wouter@blue-gate.be&gt;</author> <author>Wouter Paesen &lt;wouter@blue-gate.be&gt;</author>
<pads> <pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>audio/x-raw-float, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]</details>
</caps>
<caps> <caps>
<name>sink</name> <name>sink</name>
<direction>sink</direction> <direction>sink</direction>
<presence>always</presence> <presence>always</presence>
<details>audio/x-raw-float, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]</details> <details>audio/x-raw-float, rate=(int)[ 8000, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32</details>
</caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>audio/x-raw-float, rate=(int)[ 8000, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32</details>
</caps> </caps>
</pads> </pads>
</element> </element>

View file

@ -1,34 +0,0 @@
<plugin>
<name>switch</name>
<description>N-to-1 input switching</description>
<filename>../../gst/switch/.libs/libgstswitch.so</filename>
<basename>libgstswitch.so</basename>
<version>0.10.5.1</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer Bad Plug-ins CVS/prerelease</package>
<origin>Unknown package origin</origin>
<elements>
<element>
<name>switch</name>
<longname>StreamSelector</longname>
<class>Generic</class>
<description>N-to-1 input stream_selectoring</description>
<author>Julien Moutte &lt;julien@moutte.net&gt;012Ronald S. Bultje &lt;rbultje@ronald.bitfreak.net&gt;012Jan Schmidt &lt;thaytan@mad.scientist.com&gt;012Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>ANY</details>
</caps>
<caps>
<name>sink%d</name>
<direction>sink</direction>
<presence>request</presence>
<details>ANY</details>
</caps>
</pads>
</element>
</elements>
</plugin>

2
gst/selector/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
gstselector-marshal.c
gstselector-marshal.h

22
gst/selector/Makefile.am Normal file
View file

@ -0,0 +1,22 @@
glib_enum_prefix = gst_selector
include $(top_srcdir)/common/glib-gen.mak
built_sources = gstselector-marshal.c
built_headers = gstselector-marshal.h
BUILT_SOURCES = $(built_sources) $(built_headers)
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = gstselector-marshal.list
plugin_LTLIBRARIES = libgstselector.la
libgstselector_la_SOURCES = gstselector.c gstinputselector.c gstoutputselector.c
nodist_libgstselector_la_SOURCES = $(built_sources)
libgstselector_la_CFLAGS = $(GST_CFLAGS)
libgstselector_la_LIBADD =
libgstselector_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS)
noinst_HEADERS = gstinputselector.h gstoutputselector.h $(built_headers)

View file

@ -4,6 +4,7 @@
* Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com> * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
* Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com> * Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com>
* Copyright (C) 2007 Andy Wingo <wingo@pobox.com> * Copyright (C) 2007 Andy Wingo <wingo@pobox.com>
* Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.com>)
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -21,34 +22,42 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
/**
* SECTION:element-input-selector
* @short_description: N-to-1 stream selectoring
* @see_also: #GstOutputSelector
*
* Direct one out of N input streams to the output pad.
*/
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
#endif #endif
#include <string.h> #include <string.h>
#include "gstswitch.h" #include "gstinputselector.h"
#include "gstswitch-marshal.h" #include "gstselector-marshal.h"
GST_DEBUG_CATEGORY_STATIC (stream_selector_debug); GST_DEBUG_CATEGORY_STATIC (input_selector_debug);
#define GST_CAT_DEFAULT stream_selector_debug #define GST_CAT_DEFAULT input_selector_debug
static const GstElementDetails gst_stream_selector_details = static const GstElementDetails gst_input_selector_details =
GST_ELEMENT_DETAILS ("StreamSelector", GST_ELEMENT_DETAILS ("Input selector",
"Generic", "Generic",
"N-to-1 input stream_selectoring", "N-to-1 input stream selectoring",
"Julien Moutte <julien@moutte.net>\n" "Julien Moutte <julien@moutte.net>\n"
"Ronald S. Bultje <rbultje@ronald.bitfreak.net>\n" "Ronald S. Bultje <rbultje@ronald.bitfreak.net>\n"
"Jan Schmidt <thaytan@mad.scientist.com>\n" "Jan Schmidt <thaytan@mad.scientist.com>\n"
"Wim Taymans <wim.taymans@gmail.com>"); "Wim Taymans <wim.taymans@gmail.com>");
static GstStaticPadTemplate gst_stream_selector_sink_factory = static GstStaticPadTemplate gst_input_selector_sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink%d", GST_STATIC_PAD_TEMPLATE ("sink%d",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_REQUEST, GST_PAD_REQUEST,
GST_STATIC_CAPS_ANY); GST_STATIC_CAPS_ANY);
static GstStaticPadTemplate gst_stream_selector_src_factory = static GstStaticPadTemplate gst_input_selector_src_factory =
GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
@ -71,15 +80,15 @@ enum
SIGNAL_SWITCH, SIGNAL_SWITCH,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint gst_stream_selector_signals[LAST_SIGNAL] = { 0 }; static guint gst_input_selector_signals[LAST_SIGNAL] = { 0 };
static gboolean gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel, static gboolean gst_input_selector_is_active_sinkpad (GstInputSelector * sel,
GstPad * pad); GstPad * pad);
static GstPad *gst_stream_selector_activate_sinkpad (GstStreamSelector * sel, static GstPad *gst_input_selector_activate_sinkpad (GstInputSelector * sel,
GstPad * pad); GstPad * pad);
static GstPad *gst_stream_selector_get_linked_pad (GstPad * pad, static GstPad *gst_input_selector_get_linked_pad (GstPad * pad,
gboolean strict); gboolean strict);
static void gst_stream_selector_push_pending_stop (GstStreamSelector * self); static void gst_input_selector_push_pending_stop (GstInputSelector * self);
#define GST_TYPE_SELECTOR_PAD \ #define GST_TYPE_SELECTOR_PAD \
(gst_selector_pad_get_type()) (gst_selector_pad_get_type())
@ -148,7 +157,7 @@ gst_selector_pad_get_type (void)
}; };
selector_pad_type = selector_pad_type =
g_type_register_static (GST_TYPE_PAD, "GstSwitchPad", g_type_register_static (GST_TYPE_PAD, "GstSelectorPad",
&selector_pad_info, 0); &selector_pad_info, 0);
} }
return selector_pad_type; return selector_pad_type;
@ -243,7 +252,7 @@ gst_selector_pad_get_linked_pads (GstPad * pad)
{ {
GstPad *otherpad; GstPad *otherpad;
otherpad = gst_stream_selector_get_linked_pad (pad, TRUE); otherpad = gst_input_selector_get_linked_pad (pad, TRUE);
if (!otherpad) if (!otherpad)
return NULL; return NULL;
@ -258,14 +267,14 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event)
{ {
gboolean res = TRUE; gboolean res = TRUE;
gboolean forward = TRUE; gboolean forward = TRUE;
GstStreamSelector *sel; GstInputSelector *sel;
GstSelectorPad *selpad; GstSelectorPad *selpad;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
selpad = GST_SELECTOR_PAD_CAST (pad); selpad = GST_SELECTOR_PAD_CAST (pad);
/* only forward if we are dealing with the active sinkpad */ /* only forward if we are dealing with the active sinkpad */
forward = gst_stream_selector_is_active_sinkpad (sel, pad); forward = gst_input_selector_is_active_sinkpad (sel, pad);
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
@ -312,10 +321,10 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event)
static GstCaps * static GstCaps *
gst_selector_pad_getcaps (GstPad * pad) gst_selector_pad_getcaps (GstPad * pad)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
GstCaps *caps; GstCaps *caps;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
GST_DEBUG_OBJECT (sel, "Getting caps of srcpad peer"); GST_DEBUG_OBJECT (sel, "Getting caps of srcpad peer");
caps = gst_pad_peer_get_caps (sel->srcpad); caps = gst_pad_peer_get_caps (sel->srcpad);
@ -331,13 +340,13 @@ static GstFlowReturn
gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset, gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset,
guint size, GstCaps * caps, GstBuffer ** buf) guint size, GstCaps * caps, GstBuffer ** buf)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
GstFlowReturn result; GstFlowReturn result;
GstPad *active_sinkpad; GstPad *active_sinkpad;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad); active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
/* Fallback allocation for buffers from pads except the selected one */ /* Fallback allocation for buffers from pads except the selected one */
if (pad != active_sinkpad) { if (pad != active_sinkpad) {
@ -370,7 +379,7 @@ gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset,
} }
static gboolean static gboolean
gst_stream_selector_wait (GstStreamSelector * self, GstPad * pad) gst_input_selector_wait (GstInputSelector * self, GstPad * pad)
{ {
gboolean flushing; gboolean flushing;
@ -391,21 +400,21 @@ gst_stream_selector_wait (GstStreamSelector * self, GstPad * pad)
static GstFlowReturn static GstFlowReturn
gst_selector_pad_chain (GstPad * pad, GstBuffer * buf) gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
GstFlowReturn res; GstFlowReturn res;
GstPad *active_sinkpad; GstPad *active_sinkpad;
GstSelectorPad *selpad; GstSelectorPad *selpad;
GstClockTime end_time, duration; GstClockTime end_time, duration;
GstSegment *seg; GstSegment *seg;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
selpad = GST_SELECTOR_PAD_CAST (pad); selpad = GST_SELECTOR_PAD_CAST (pad);
seg = &selpad->segment; seg = &selpad->segment;
if (gst_stream_selector_wait (sel, pad)) if (gst_input_selector_wait (sel, pad))
goto ignore; goto ignore;
active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad); active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
end_time = GST_BUFFER_TIMESTAMP (buf); end_time = GST_BUFFER_TIMESTAMP (buf);
if (GST_CLOCK_TIME_IS_VALID (end_time)) { if (GST_CLOCK_TIME_IS_VALID (end_time)) {
@ -421,7 +430,7 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
if (pad != active_sinkpad) if (pad != active_sinkpad)
goto ignore; goto ignore;
gst_stream_selector_push_pending_stop (sel); gst_input_selector_push_pending_stop (sel);
/* if we have a pending segment, push it out now */ /* if we have a pending segment, push it out now */
if (selpad->segment_pending) { if (selpad->segment_pending) {
@ -450,101 +459,100 @@ ignore:
} }
} }
static void gst_stream_selector_dispose (GObject * object); static void gst_input_selector_dispose (GObject * object);
static void gst_stream_selector_init (GstStreamSelector * sel); static void gst_input_selector_init (GstInputSelector * sel);
static void gst_stream_selector_base_init (GstStreamSelectorClass * klass); static void gst_input_selector_base_init (GstInputSelectorClass * klass);
static void gst_stream_selector_class_init (GstStreamSelectorClass * klass); static void gst_input_selector_class_init (GstInputSelectorClass * klass);
static void gst_stream_selector_set_property (GObject * object, static void gst_input_selector_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec); guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_stream_selector_get_property (GObject * object, static void gst_input_selector_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec); guint prop_id, GValue * value, GParamSpec * pspec);
static GstPad *gst_stream_selector_request_new_pad (GstElement * element, static GstPad *gst_input_selector_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * unused); GstPadTemplate * templ, const gchar * unused);
static void gst_stream_selector_release_pad (GstElement * element, static void gst_input_selector_release_pad (GstElement * element, GstPad * pad);
GstPad * pad); static GstStateChangeReturn gst_input_selector_change_state (GstElement *
static GstStateChangeReturn gst_stream_selector_change_state (GstElement *
element, GstStateChange transition); element, GstStateChange transition);
static GList *gst_stream_selector_get_linked_pads (GstPad * pad); static GList *gst_input_selector_get_linked_pads (GstPad * pad);
static GstCaps *gst_stream_selector_getcaps (GstPad * pad); static GstCaps *gst_input_selector_getcaps (GstPad * pad);
static gint64 gst_stream_selector_block (GstStreamSelector * self); static gint64 gst_input_selector_block (GstInputSelector * self);
static void gst_stream_selector_switch (GstStreamSelector * self, static void gst_input_selector_switch (GstInputSelector * self,
const gchar * pad_name, gint64 stop_time, gint64 start_time); const gchar * pad_name, gint64 stop_time, gint64 start_time);
static GstElementClass *parent_class = NULL; static GstElementClass *parent_class = NULL;
GType GType
gst_stream_selector_get_type (void) gst_input_selector_get_type (void)
{ {
static GType stream_selector_type = 0; static GType input_selector_type = 0;
if (!stream_selector_type) { if (!input_selector_type) {
static const GTypeInfo stream_selector_info = { static const GTypeInfo input_selector_info = {
sizeof (GstStreamSelectorClass), sizeof (GstInputSelectorClass),
(GBaseInitFunc) gst_stream_selector_base_init, (GBaseInitFunc) gst_input_selector_base_init,
NULL, NULL,
(GClassInitFunc) gst_stream_selector_class_init, (GClassInitFunc) gst_input_selector_class_init,
NULL, NULL,
NULL, NULL,
sizeof (GstStreamSelector), sizeof (GstInputSelector),
0, 0,
(GInstanceInitFunc) gst_stream_selector_init, (GInstanceInitFunc) gst_input_selector_init,
}; };
stream_selector_type = input_selector_type =
g_type_register_static (GST_TYPE_ELEMENT, g_type_register_static (GST_TYPE_ELEMENT,
"GstSwitch", &stream_selector_info, 0); "GstInputSelector", &input_selector_info, 0);
GST_DEBUG_CATEGORY_INIT (stream_selector_debug, GST_DEBUG_CATEGORY_INIT (input_selector_debug,
"streamselector", 0, "A stream-selector element"); "input-selector", 0, "An input stream selector element");
} }
return stream_selector_type; return input_selector_type;
} }
static void static void
gst_stream_selector_base_init (GstStreamSelectorClass * klass) gst_input_selector_base_init (GstInputSelectorClass * klass)
{ {
GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_set_details (element_class, &gst_stream_selector_details); gst_element_class_set_details (element_class, &gst_input_selector_details);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_stream_selector_sink_factory)); gst_static_pad_template_get (&gst_input_selector_sink_factory));
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_stream_selector_src_factory)); gst_static_pad_template_get (&gst_input_selector_src_factory));
} }
static void static void
gst_stream_selector_class_init (GstStreamSelectorClass * klass) gst_input_selector_class_init (GstInputSelectorClass * klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass); parent_class = g_type_class_peek_parent (klass);
gobject_class->set_property = gobject_class->set_property =
GST_DEBUG_FUNCPTR (gst_stream_selector_set_property); GST_DEBUG_FUNCPTR (gst_input_selector_set_property);
gobject_class->get_property = gobject_class->get_property =
GST_DEBUG_FUNCPTR (gst_stream_selector_get_property); GST_DEBUG_FUNCPTR (gst_input_selector_get_property);
g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD, g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
g_param_spec_string ("active-pad", "Active pad", g_param_spec_string ("active-pad", "Active pad",
"Name of the currently" " active sink pad", NULL, G_PARAM_READWRITE)); "Name of the currently" " active sink pad", NULL, G_PARAM_READWRITE));
gobject_class->dispose = gst_stream_selector_dispose; gobject_class->dispose = gst_input_selector_dispose;
gstelement_class->request_new_pad = gst_stream_selector_request_new_pad; gstelement_class->request_new_pad = gst_input_selector_request_new_pad;
gstelement_class->release_pad = gst_stream_selector_release_pad; gstelement_class->release_pad = gst_input_selector_release_pad;
gstelement_class->change_state = gst_stream_selector_change_state; gstelement_class->change_state = gst_input_selector_change_state;
/** /**
* GstStreamSelector::block: * GstInputSelector::block:
* @streamselector: the #GstStreamSelector * @inputselector: the #GstInputSelector
* *
* Block all sink pads in preparation for a switch. Returns the stop time of * Block all sink pads in preparation for a switch. Returns the stop time of
* the current switch segment, as a running time, or 0 if there is no current * the current switch segment, as a running time, or 0 if there is no current
* active pad or the current active pad never received data. * active pad or the current active pad never received data.
*/ */
gst_stream_selector_signals[SIGNAL_BLOCK] = gst_input_selector_signals[SIGNAL_BLOCK] =
g_signal_new ("block", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, g_signal_new ("block", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstStreamSelectorClass, block), G_STRUCT_OFFSET (GstInputSelectorClass, block),
NULL, NULL, gst_switch_marshal_INT64__VOID, G_TYPE_INT64, 0); NULL, NULL, gst_selector_marshal_INT64__VOID, G_TYPE_INT64, 0);
/** /**
* GstStreamSelector::switch: * GstInputSelector::switch:
* @streamselector: the #GstStreamSelector * @inputselector: the #GstInputSelector
* @pad: name of pad to switch to * @pad: name of pad to switch to
* @stop_time: running time at which to close the previous segment, or -1 * @stop_time: running time at which to close the previous segment, or -1
* to use the running time of the previously active sink pad * to use the running time of the previously active sink pad
@ -555,7 +563,7 @@ gst_stream_selector_class_init (GstStreamSelectorClass * klass)
* any, will be closed, and a new segment opened before data flows again. * any, will be closed, and a new segment opened before data flows again.
* *
* This signal must be emitted when the element has been blocked via the <link * This signal must be emitted when the element has been blocked via the <link
* linkend="GstStreamSelector-block">block</link> signal. * linkend="GstInputSelector-block">block</link> signal.
* *
* If you have a stream with only one switch element, such as an audio-only * If you have a stream with only one switch element, such as an audio-only
* stream, a stream switch should be performed by first emitting the block * stream, a stream switch should be performed by first emitting the block
@ -569,7 +577,7 @@ gst_stream_selector_class_init (GstStreamSelectorClass * klass)
* have one switch element between the audio feeds and one for video. * have one switch element between the audio feeds and one for video.
* *
* A switch over multiple switch elements should be performed as follows: * A switch over multiple switch elements should be performed as follows:
* First, emit the <link linkend="GstStreamSelector-block">block</link> * First, emit the <link linkend="GstInputSelector-block">block</link>
* signal, collecting the returned values. The maximum running time returned * signal, collecting the returned values. The maximum running time returned
* by block should then be used as the time at which to close the previous * by block should then be used as the time at which to close the previous
* segment. * segment.
@ -582,24 +590,24 @@ gst_stream_selector_class_init (GstStreamSelectorClass * klass)
* If @pad is the same as the current active pad, the element will cancel any * If @pad is the same as the current active pad, the element will cancel any
* previous block without adjusting segments. * previous block without adjusting segments.
*/ */
gst_stream_selector_signals[SIGNAL_SWITCH] = gst_input_selector_signals[SIGNAL_SWITCH] =
g_signal_new ("switch", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, g_signal_new ("switch", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstStreamSelectorClass, switch_), G_STRUCT_OFFSET (GstInputSelectorClass, switch_),
NULL, NULL, gst_switch_marshal_VOID__STRING_INT64_INT64, NULL, NULL, gst_selector_marshal_VOID__STRING_INT64_INT64,
G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64); G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64);
klass->block = GST_DEBUG_FUNCPTR (gst_stream_selector_block); klass->block = GST_DEBUG_FUNCPTR (gst_input_selector_block);
klass->switch_ = GST_DEBUG_FUNCPTR (gst_stream_selector_switch); klass->switch_ = GST_DEBUG_FUNCPTR (gst_input_selector_switch);
} }
static void static void
gst_stream_selector_init (GstStreamSelector * sel) gst_input_selector_init (GstInputSelector * sel)
{ {
sel->srcpad = gst_pad_new ("src", GST_PAD_SRC); sel->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_internal_link_function (sel->srcpad, gst_pad_set_internal_link_function (sel->srcpad,
GST_DEBUG_FUNCPTR (gst_stream_selector_get_linked_pads)); GST_DEBUG_FUNCPTR (gst_input_selector_get_linked_pads));
gst_pad_set_getcaps_function (sel->srcpad, gst_pad_set_getcaps_function (sel->srcpad,
GST_DEBUG_FUNCPTR (gst_stream_selector_getcaps)); GST_DEBUG_FUNCPTR (gst_input_selector_getcaps));
gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad); gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad);
/* sinkpad management */ /* sinkpad management */
sel->active_sinkpad = NULL; sel->active_sinkpad = NULL;
@ -611,9 +619,9 @@ gst_stream_selector_init (GstStreamSelector * sel)
} }
static void static void
gst_stream_selector_dispose (GObject * object) gst_input_selector_dispose (GObject * object)
{ {
GstStreamSelector *sel = GST_STREAM_SELECTOR (object); GstInputSelector *sel = GST_INPUT_SELECTOR (object);
if (sel->active_sinkpad) { if (sel->active_sinkpad) {
gst_object_unref (sel->active_sinkpad); gst_object_unref (sel->active_sinkpad);
@ -652,7 +660,7 @@ gst_segment_set_start (GstSegment * segment, gint64 running_time)
} }
static void static void
gst_stream_selector_set_active_pad (GstStreamSelector * self, gst_input_selector_set_active_pad (GstInputSelector * self,
const gchar * pad_name, gint64 stop_time, gint64 start_time) const gchar * pad_name, gint64 stop_time, gint64 start_time)
{ {
GstPad *pad; GstPad *pad;
@ -701,14 +709,14 @@ done:
static void static void
gst_stream_selector_set_property (GObject * object, guint prop_id, gst_input_selector_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
{ {
GstStreamSelector *sel = GST_STREAM_SELECTOR (object); GstInputSelector *sel = GST_INPUT_SELECTOR (object);
switch (prop_id) { switch (prop_id) {
case PROP_ACTIVE_PAD: case PROP_ACTIVE_PAD:
gst_stream_selector_set_active_pad (sel, gst_input_selector_set_active_pad (sel,
g_value_get_string (value), GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE); g_value_get_string (value), GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE);
break; break;
default: default:
@ -718,10 +726,10 @@ gst_stream_selector_set_property (GObject * object, guint prop_id,
} }
static void static void
gst_stream_selector_get_property (GObject * object, guint prop_id, gst_input_selector_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec) GValue * value, GParamSpec * pspec)
{ {
GstStreamSelector *sel = GST_STREAM_SELECTOR (object); GstInputSelector *sel = GST_INPUT_SELECTOR (object);
switch (prop_id) { switch (prop_id) {
case PROP_ACTIVE_PAD:{ case PROP_ACTIVE_PAD:{
@ -741,12 +749,12 @@ gst_stream_selector_get_property (GObject * object, guint prop_id,
} }
static GstPad * static GstPad *
gst_stream_selector_get_linked_pad (GstPad * pad, gboolean strict) gst_input_selector_get_linked_pad (GstPad * pad, gboolean strict)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
GstPad *otherpad = NULL; GstPad *otherpad = NULL;
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad)); sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
GST_OBJECT_LOCK (sel); GST_OBJECT_LOCK (sel);
if (pad == sel->srcpad) if (pad == sel->srcpad)
otherpad = sel->active_sinkpad; otherpad = sel->active_sinkpad;
@ -760,13 +768,13 @@ gst_stream_selector_get_linked_pad (GstPad * pad, gboolean strict)
} }
static GstCaps * static GstCaps *
gst_stream_selector_getcaps (GstPad * pad) gst_input_selector_getcaps (GstPad * pad)
{ {
GstPad *otherpad; GstPad *otherpad;
GstObject *parent; GstObject *parent;
GstCaps *caps; GstCaps *caps;
otherpad = gst_stream_selector_get_linked_pad (pad, FALSE); otherpad = gst_input_selector_get_linked_pad (pad, FALSE);
parent = gst_object_get_parent (GST_OBJECT (pad)); parent = gst_object_get_parent (GST_OBJECT (pad));
if (!otherpad) { if (!otherpad) {
GST_DEBUG_OBJECT (parent, GST_DEBUG_OBJECT (parent,
@ -789,7 +797,7 @@ gst_stream_selector_getcaps (GstPad * pad)
/* check if the pad is the active sinkpad */ /* check if the pad is the active sinkpad */
static gboolean static gboolean
gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel, GstPad * pad) gst_input_selector_is_active_sinkpad (GstInputSelector * sel, GstPad * pad)
{ {
GstSelectorPad *selpad; GstSelectorPad *selpad;
gboolean res; gboolean res;
@ -805,7 +813,7 @@ gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel, GstPad * pad)
/* Get or create the active sinkpad */ /* Get or create the active sinkpad */
static GstPad * static GstPad *
gst_stream_selector_activate_sinkpad (GstStreamSelector * sel, GstPad * pad) gst_input_selector_activate_sinkpad (GstInputSelector * sel, GstPad * pad)
{ {
GstPad *active_sinkpad; GstPad *active_sinkpad;
GstSelectorPad *selpad; GstSelectorPad *selpad;
@ -826,11 +834,11 @@ gst_stream_selector_activate_sinkpad (GstStreamSelector * sel, GstPad * pad)
} }
static GList * static GList *
gst_stream_selector_get_linked_pads (GstPad * pad) gst_input_selector_get_linked_pads (GstPad * pad)
{ {
GstPad *otherpad; GstPad *otherpad;
otherpad = gst_stream_selector_get_linked_pad (pad, TRUE); otherpad = gst_input_selector_get_linked_pad (pad, TRUE);
if (!otherpad) if (!otherpad)
return NULL; return NULL;
/* need to drop the ref, internal linked pads is not MT safe */ /* need to drop the ref, internal linked pads is not MT safe */
@ -839,14 +847,14 @@ gst_stream_selector_get_linked_pads (GstPad * pad)
} }
static GstPad * static GstPad *
gst_stream_selector_request_new_pad (GstElement * element, gst_input_selector_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * unused) GstPadTemplate * templ, const gchar * unused)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
gchar *name = NULL; gchar *name = NULL;
GstPad *sinkpad = NULL; GstPad *sinkpad = NULL;
sel = GST_STREAM_SELECTOR (element); sel = GST_INPUT_SELECTOR (element);
g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL); g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL);
GST_LOG_OBJECT (sel, "Creating new pad %d", sel->nb_sinkpads); GST_LOG_OBJECT (sel, "Creating new pad %d", sel->nb_sinkpads);
GST_OBJECT_LOCK (sel); GST_OBJECT_LOCK (sel);
@ -873,11 +881,11 @@ gst_stream_selector_request_new_pad (GstElement * element,
} }
static void static void
gst_stream_selector_release_pad (GstElement * element, GstPad * pad) gst_input_selector_release_pad (GstElement * element, GstPad * pad)
{ {
GstStreamSelector *sel; GstInputSelector *sel;
sel = GST_STREAM_SELECTOR (element); sel = GST_INPUT_SELECTOR (element);
GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad)); GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
GST_OBJECT_LOCK (sel); GST_OBJECT_LOCK (sel);
@ -893,10 +901,10 @@ gst_stream_selector_release_pad (GstElement * element, GstPad * pad)
} }
static GstStateChangeReturn static GstStateChangeReturn
gst_stream_selector_change_state (GstElement * element, gst_input_selector_change_state (GstElement * element,
GstStateChange transition) GstStateChange transition)
{ {
GstStreamSelector *self = GST_STREAM_SELECTOR (element); GstInputSelector *self = GST_INPUT_SELECTOR (element);
GstStateChangeReturn result; GstStateChangeReturn result;
result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
@ -912,7 +920,7 @@ gst_stream_selector_change_state (GstElement * element,
} }
static gint64 static gint64
gst_stream_selector_block (GstStreamSelector * self) gst_input_selector_block (GstInputSelector * self)
{ {
gint64 ret = 0; gint64 ret = 0;
GstSelectorPad *spad; GstSelectorPad *spad;
@ -936,7 +944,7 @@ gst_stream_selector_block (GstStreamSelector * self)
} }
static void static void
gst_stream_selector_push_pending_stop (GstStreamSelector * self) gst_input_selector_push_pending_stop (GstInputSelector * self)
{ {
GstEvent *event = NULL; GstEvent *event = NULL;
@ -959,28 +967,15 @@ gst_stream_selector_push_pending_stop (GstStreamSelector * self)
/* stop_time and start_time are running times */ /* stop_time and start_time are running times */
static void static void
gst_stream_selector_switch (GstStreamSelector * self, const gchar * pad_name, gst_input_selector_switch (GstInputSelector * self, const gchar * pad_name,
gint64 stop_time, gint64 start_time) gint64 stop_time, gint64 start_time)
{ {
g_return_if_fail (self->blocked == TRUE); g_return_if_fail (self->blocked == TRUE);
gst_stream_selector_set_active_pad (self, pad_name, stop_time, start_time); gst_input_selector_set_active_pad (self, pad_name, stop_time, start_time);
GST_OBJECT_LOCK (self); GST_OBJECT_LOCK (self);
self->blocked = FALSE; self->blocked = FALSE;
g_cond_broadcast (self->blocked_cond); g_cond_broadcast (self->blocked_cond);
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
} }
static gboolean
plugin_init (GstPlugin * plugin)
{
return gst_element_register (plugin, "switch", GST_RANK_NONE,
GST_TYPE_STREAM_SELECTOR);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"switch",
"N-to-1 input switching",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)

View file

@ -1,6 +1,7 @@
/* GStreamer /* GStreamer
* Copyright (C) 2003 Julien Moutte <julien@moutte.net> * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
* Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.com>)
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -18,28 +19,28 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
#ifndef __GST_STREAM_SELECTOR_H__ #ifndef __GST_INPUT_SELECTOR_H__
#define __GST_STREAM_SELECTOR_H__ #define __GST_INPUT_SELECTOR_H__
#include <gst/gst.h> #include <gst/gst.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_TYPE_STREAM_SELECTOR \ #define GST_TYPE_INPUT_SELECTOR \
(gst_stream_selector_get_type()) (gst_input_selector_get_type())
#define GST_STREAM_SELECTOR(obj) \ #define GST_INPUT_SELECTOR(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_STREAM_SELECTOR, GstStreamSelector)) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INPUT_SELECTOR, GstInputSelector))
#define GST_STREAM_SELECTOR_CLASS(klass) \ #define GST_INPUT_SELECTOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_STREAM_SELECTOR, GstStreamSelectorClass)) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INPUT_SELECTOR, GstInputSelectorClass))
#define GST_IS_STREAM_SELECTOR(obj) \ #define GST_IS_INPUT_SELECTOR(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_STREAM_SELECTOR)) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INPUT_SELECTOR))
#define GST_IS_STREAM_SELECTOR_CLASS(klass) \ #define GST_IS_INPUT_SELECTOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_STREAM_SELECTOR)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INPUT_SELECTOR))
typedef struct _GstStreamSelector GstStreamSelector; typedef struct _GstInputSelector GstInputSelector;
typedef struct _GstStreamSelectorClass GstStreamSelectorClass; typedef struct _GstInputSelectorClass GstInputSelectorClass;
struct _GstStreamSelector { struct _GstInputSelector {
GstElement element; GstElement element;
GstPad *srcpad; GstPad *srcpad;
@ -55,16 +56,16 @@ struct _GstStreamSelector {
GstSegment pending_stop_segment; GstSegment pending_stop_segment;
}; };
struct _GstStreamSelectorClass { struct _GstInputSelectorClass {
GstElementClass parent_class; GstElementClass parent_class;
gint64 (*block) (GstStreamSelector *self); gint64 (*block) (GstInputSelector *self);
void (*switch_) (GstStreamSelector *self, const gchar *pad_name, void (*switch_) (GstInputSelector *self, const gchar *pad_name,
gint64 stop_time, gint64 start_time); gint64 stop_time, gint64 start_time);
}; };
GType gst_stream_selector_get_type (void); GType gst_input_selector_get_type (void);
G_END_DECLS G_END_DECLS
#endif /* __GST_STREAM_SELECTOR_H__ */ #endif /* __GST_INPUT_SELECTOR_H__ */

View file

@ -0,0 +1,448 @@
/* GStreamer
* Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.com>)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
* SECTION:element-output-selector
* @short_description: 1-to-N stream selectoring
* @see_also: #GstTee, #GstInputSelector
*
* Direct input stream to one out of N output pads.
*/
/* FIXME: By default basesinks require some prerolled data before changing
to playing state. Also pipeline with output-selector connected to multiple
sink elements won't change to playing until all sink elements have received
the preroll data. Currently this can be worked around using live source element
and and exporting GST_COMPAT="no-live-preroll".
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
#include "gstoutputselector.h"
GST_DEBUG_CATEGORY_STATIC (output_selector_debug);
#define GST_CAT_DEFAULT output_selector_debug
static const GstElementDetails gst_output_selector_details =
GST_ELEMENT_DETAILS ("Output selector",
"Generic",
"1-to-N output stream selectoring",
"Stefan Kost <stefan.kost@nokia.com>");
static GstStaticPadTemplate gst_output_selector_sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
static GstStaticPadTemplate gst_output_selector_src_factory =
GST_STATIC_PAD_TEMPLATE ("src%d",
GST_PAD_SRC,
GST_PAD_REQUEST,
GST_STATIC_CAPS_ANY);
enum
{
PROP_ACTIVE_PAD = 1,
PROP_RESEND_LATEST
};
static void gst_output_selector_dispose (GObject * object);
static void gst_output_selector_init (GstOutputSelector * sel);
static void gst_output_selector_base_init (GstOutputSelectorClass * klass);
static void gst_output_selector_class_init (GstOutputSelectorClass * klass);
static void gst_output_selector_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_output_selector_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec);
static GstPad *gst_output_selector_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * unused);
static void gst_output_selector_release_pad (GstElement * element,
GstPad * pad);
static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf);
static GstStateChangeReturn gst_output_selector_change_state (GstElement *
element, GstStateChange transition);
static gboolean gst_output_selector_handle_sink_event (GstPad * pad,
GstEvent * event);
static GstElementClass *parent_class = NULL;
GType
gst_output_selector_get_type (void)
{
static GType output_selector_type = 0;
if (!output_selector_type) {
static const GTypeInfo output_selector_info = {
sizeof (GstOutputSelectorClass),
(GBaseInitFunc) gst_output_selector_base_init,
NULL,
(GClassInitFunc) gst_output_selector_class_init,
NULL,
NULL,
sizeof (GstOutputSelector),
0,
(GInstanceInitFunc) gst_output_selector_init,
};
output_selector_type =
g_type_register_static (GST_TYPE_ELEMENT,
"GstOutputSelector", &output_selector_info, 0);
GST_DEBUG_CATEGORY_INIT (output_selector_debug,
"output-selector", 0, "An output stream selector element");
}
return output_selector_type;
}
static void
gst_output_selector_base_init (GstOutputSelectorClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_set_details (element_class, &gst_output_selector_details);
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_output_selector_sink_factory));
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_output_selector_src_factory));
}
static void
gst_output_selector_class_init (GstOutputSelectorClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
gobject_class->set_property =
GST_DEBUG_FUNCPTR (gst_output_selector_set_property);
gobject_class->get_property =
GST_DEBUG_FUNCPTR (gst_output_selector_get_property);
g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
g_param_spec_string ("active-pad", "Active pad",
"Name of the currently active src pad", NULL, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_RESEND_LATEST,
g_param_spec_boolean ("resend-latest", "Resend latest buffer",
"Resend latest buffer after a switch to a new pad", FALSE,
G_PARAM_READWRITE));
gobject_class->dispose = gst_output_selector_dispose;
gstelement_class->request_new_pad =
GST_DEBUG_FUNCPTR (gst_output_selector_request_new_pad);
gstelement_class->release_pad =
GST_DEBUG_FUNCPTR (gst_output_selector_release_pad);
gstelement_class->change_state = gst_output_selector_change_state;
}
static void
gst_output_selector_init (GstOutputSelector * sel)
{
sel->sinkpad =
gst_pad_new_from_static_template (&gst_output_selector_sink_factory,
"sink");
gst_pad_set_chain_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_output_selector_chain));
gst_pad_set_event_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_output_selector_handle_sink_event));
gst_element_add_pad (GST_ELEMENT (sel), sel->sinkpad);
/*
gst_pad_set_bufferalloc_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_output_selector_bufferalloc));
gst_pad_set_setcaps_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps));
gst_pad_set_getcaps_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
*/
/* srcpad management */
sel->active_srcpad = NULL;
sel->nb_srcpads = 0;
gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
sel->pending_srcpad = NULL;
sel->resend_latest = FALSE;
sel->latest_buffer = NULL;
}
static void
gst_output_selector_dispose (GObject * object)
{
GstOutputSelector *osel = GST_OUTPUT_SELECTOR (object);
if (osel->pending_srcpad != NULL) {
gst_object_unref (osel->pending_srcpad);
osel->pending_srcpad = NULL;
}
if (osel->latest_buffer != NULL) {
gst_buffer_unref (osel->latest_buffer);
osel->latest_buffer = NULL;
}
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gst_output_selector_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
switch (prop_id) {
case PROP_ACTIVE_PAD:{
GstPad *next_pad =
gst_element_get_static_pad (GST_ELEMENT (sel),
g_value_get_string (value));
if (next_pad && (next_pad != sel->active_srcpad)) {
/* switch to new srcpad in next chain run */
if (sel->pending_srcpad != NULL) {
GST_INFO ("replacing pending switch");
gst_object_unref (sel->pending_srcpad);
}
sel->pending_srcpad = next_pad;
} else {
GST_WARNING ("setting active pad failed");
}
break;
}
case PROP_RESEND_LATEST:{
sel->resend_latest = g_value_get_boolean (value);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_output_selector_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
switch (prop_id) {
case PROP_ACTIVE_PAD:{
GST_OBJECT_LOCK (object);
if (sel->active_srcpad != NULL) {
g_value_take_string (value, gst_pad_get_name (sel->active_srcpad));
} else {
g_value_set_string (value, "");
}
GST_OBJECT_UNLOCK (object);
break;
}
case PROP_RESEND_LATEST:{
GST_OBJECT_LOCK (object);
g_value_set_boolean (value, sel->resend_latest);
GST_OBJECT_UNLOCK (object);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstPad *
gst_output_selector_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name)
{
gchar *padname;
GstPad *srcpad;
GstOutputSelector *osel;
osel = GST_OUTPUT_SELECTOR (element);
GST_DEBUG_OBJECT (osel, "requesting pad");
GST_OBJECT_LOCK (osel);
padname = g_strdup_printf ("src%d", osel->nb_srcpads++);
srcpad = gst_pad_new_from_template (templ, padname);
GST_OBJECT_UNLOCK (osel);
gst_pad_set_active (srcpad, TRUE);
gst_element_add_pad (GST_ELEMENT (osel), srcpad);
/* Set the first requested src pad as active by default */
if (osel->active_srcpad == NULL) {
osel->active_srcpad = srcpad;
}
g_free (padname);
return srcpad;
}
static void
gst_output_selector_release_pad (GstElement * element, GstPad * pad)
{
GstOutputSelector *osel;
osel = GST_OUTPUT_SELECTOR (element);
GST_DEBUG_OBJECT (osel, "releasing pad");
gst_pad_set_active (pad, FALSE);
gst_element_remove_pad (GST_ELEMENT_CAST (osel), pad);
}
static gboolean
gst_output_selector_switch (GstOutputSelector * osel)
{
gboolean res = TRUE;
GstEvent *ev = NULL;
GstSegment *seg = NULL;
gint64 start = 0, position = 0;
GST_INFO ("switching to pad %" GST_PTR_FORMAT, osel->pending_srcpad);
if (gst_pad_is_linked (osel->pending_srcpad)) {
/* Send NEWSEGMENT to the pad we are going to switch to */
seg = &osel->segment;
/* If resending then mark newsegment start and position accordingly */
if (osel->resend_latest && osel->latest_buffer &&
GST_BUFFER_TIMESTAMP_IS_VALID (osel->latest_buffer)) {
start = position = GST_BUFFER_TIMESTAMP (osel->latest_buffer);
} else {
start = position = seg->last_stop;
}
ev = gst_event_new_new_segment (TRUE, seg->rate,
seg->format, start, seg->stop, position);
if (!gst_pad_push_event (osel->pending_srcpad, ev)) {
GST_WARNING ("newsegment handling failed in %" GST_PTR_FORMAT,
osel->pending_srcpad);
}
/* Resend latest buffer to newly switched pad */
if (osel->resend_latest && osel->latest_buffer) {
GST_INFO ("resending latest buffer");
gst_pad_push (osel->pending_srcpad, osel->latest_buffer);
osel->latest_buffer = NULL;
}
/* Switch */
osel->active_srcpad = osel->pending_srcpad;
} else {
GST_WARNING ("switch failed, pad not linked");
res = FALSE;
}
gst_object_unref (osel->pending_srcpad);
osel->pending_srcpad = NULL;
return res;
}
static GstFlowReturn
gst_output_selector_chain (GstPad * pad, GstBuffer * buf)
{
GstFlowReturn res;
GstOutputSelector *osel;
GstClockTime last_stop, duration;
osel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
if (osel->pending_srcpad) {
/* Do the switch */
gst_output_selector_switch (osel);
}
/* Keep reference to latest buffer to resend it after switch */
if (osel->resend_latest) {
if (osel->latest_buffer)
gst_buffer_unref (osel->latest_buffer);
osel->latest_buffer = gst_buffer_ref (buf);
}
/* Keep track of last stop and use it in NEWSEGMENT start after
switching to a new src pad */
last_stop = GST_BUFFER_TIMESTAMP (buf);
if (GST_CLOCK_TIME_IS_VALID (last_stop)) {
duration = GST_BUFFER_DURATION (buf);
if (GST_CLOCK_TIME_IS_VALID (duration)) {
last_stop += duration;
}
GST_LOG ("setting last stop %" GST_TIME_FORMAT, GST_TIME_ARGS (last_stop));
gst_segment_set_last_stop (&osel->segment, osel->segment.format, last_stop);
}
GST_LOG ("pushing buffer to %" GST_PTR_FORMAT, osel->active_srcpad);
res = gst_pad_push (osel->active_srcpad, buf);
gst_object_unref (osel);
return res;
}
static GstStateChangeReturn
gst_output_selector_change_state (GstElement * element,
GstStateChange transition)
{
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
}
static gboolean
gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
{
gboolean res = TRUE;
GstOutputSelector *sel;
sel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_NEWSEGMENT:
{
gboolean update;
GstFormat format;
gdouble rate, arate;
gint64 start, stop, time;
gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
&start, &stop, &time);
GST_DEBUG ("configured NEWSEGMENT update %d, rate %lf, applied rate %lf, "
"format %d, "
"%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
G_GINT64_FORMAT, update, rate, arate, format, start, stop, time);
gst_segment_set_newsegment_full (&sel->segment, update,
rate, arate, format, start, stop, time);
/* Send newsegment to all src pads */
gst_pad_event_default (pad, event);
break;
}
case GST_EVENT_EOS:
/* Send eos to all src pads */
gst_pad_event_default (pad, event);
break;
default:
/* Send other events to active src pad */
res = gst_pad_push_event (sel->active_srcpad, event);
break;
}
gst_object_unref (sel);
return res;
}

View file

@ -0,0 +1,66 @@
/* GStreamer
* Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.com>)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_OUTPUT_SELECTOR_H__
#define __GST_OUTPUT_SELECTOR_H__
#include <gst/gst.h>
G_BEGIN_DECLS
#define GST_TYPE_OUTPUT_SELECTOR \
(gst_output_selector_get_type())
#define GST_OUTPUT_SELECTOR(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelector))
#define GST_OUTPUT_SELECTOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelectorClass))
#define GST_IS_OUTPUT_SELECTOR(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OUTPUT_SELECTOR))
#define GST_IS_OUTPUT_SELECTOR_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OUTPUT_SELECTOR))
typedef struct _GstOutputSelector GstOutputSelector;
typedef struct _GstOutputSelectorClass GstOutputSelectorClass;
struct _GstOutputSelector {
GstElement element;
GstPad *sinkpad;
GstPad *active_srcpad;
GstPad *pending_srcpad;
guint nb_srcpads;
GstSegment segment;
/* resend latest buffer after switch */
gboolean resend_latest;
GstBuffer *latest_buffer;
};
struct _GstOutputSelectorClass {
GstElementClass parent_class;
};
GType gst_output_selector_get_type (void);
G_END_DECLS
#endif /* __GST_OUTPUT_SELECTOR_H__ */

View file

@ -0,0 +1,44 @@
/* GStreamer
* Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.com>)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
#include "gstinputselector.h"
#include "gstoutputselector.h"
static gboolean
plugin_init (GstPlugin * plugin)
{
return gst_element_register (plugin, "input-selector",
GST_RANK_NONE, GST_TYPE_INPUT_SELECTOR) &&
gst_element_register (plugin, "output-selector",
GST_RANK_NONE, GST_TYPE_OUTPUT_SELECTOR);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"selector",
"input/output stream selector elements",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)

View file

@ -2,7 +2,7 @@
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="7.10" Version="7.10"
Name="switch" Name="selector"
ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D678CF}" ProjectGUID="{979C216F-0ACF-4956-AE00-055A42D678CF}"
Keyword="Win32Proj"> Keyword="Win32Proj">
<Platforms> <Platforms>
@ -20,7 +20,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2" AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;switch_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;selector_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
@ -33,15 +33,15 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib" AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
OutputFile="$(OutDir)/gstswitch.dll" OutputFile="$(OutDir)/gstselector.dll"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="../../../gstreamer/win32/Debug;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib" AdditionalLibraryDirectories="../../../gstreamer/win32/Debug;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
ModuleDefinitionFile="" ModuleDefinitionFile=""
GenerateDebugInformation="TRUE" GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/switch.pdb" ProgramDatabaseFile="$(OutDir)/selectro.pdb"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
ImportLibrary="$(OutDir)/gstswitch.lib" ImportLibrary="$(OutDir)/gstselectro.lib"
TargetMachine="1"/> TargetMachine="1"/>
<Tool <Tool
Name="VCMIDLTool"/> Name="VCMIDLTool"/>
@ -74,7 +74,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2" AdditionalIncludeDirectories="../../../gstreamer/win32;../../../gstreamer;../../../gstreamer/libs;../../../glib;../../../glib/glib;../../../glib/gmodule;&quot;../../gst-libs&quot;;../../../popt/include;../../../libxml2/include/libxml2"
PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;switch_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES" PreprocessorDefinitions="WIN32;NDEBUG;GST_DISABLE_GST_DEBUG;_WINDOWS;_USRDLL;selector_EXPORTS;HAVE_CONFIG_H;_USE_MATH_DEFINES"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
@ -85,7 +85,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib" AdditionalDependencies="glib-2.0.lib gmodule-2.0.lib gthread-2.0.lib gobject-2.0.lib libgstreamer.lib gstbytestream.lib iconv.lib intl.lib"
OutputFile="$(OutDir)/gstswitch.dll" OutputFile="$(OutDir)/gstselector.dll"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="../../../gstreamer/win32/Release;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib" AdditionalLibraryDirectories="../../../gstreamer/win32/Release;../../../glib/glib;../../../glib/gmodule;../../../glib/gthread;../../../glib/gobject;../../../gettext/lib;../../../libiconv/lib"
ModuleDefinitionFile="" ModuleDefinitionFile=""
@ -93,7 +93,7 @@
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/gstswitch.lib" ImportLibrary="$(OutDir)/gstselector.lib"
TargetMachine="1"/> TargetMachine="1"/>
<Tool <Tool
Name="VCMIDLTool"/> Name="VCMIDLTool"/>
@ -126,7 +126,7 @@
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File <File
RelativePath=".\gstswitch.c"> RelativePath=".\gstselector.c">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -134,7 +134,7 @@
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File <File
RelativePath=".\gstswitch.h"> RelativePath=".\gstselector.h">
</File> </File>
</Filter> </Filter>
<Filter <Filter

View file

@ -1,2 +0,0 @@
gstswitch-marshal.c
gstswitch-marshal.h

View file

@ -1,22 +0,0 @@
glib_enum_prefix = gst_switch
include $(top_srcdir)/common/glib-gen.mak
built_sources = gstswitch-marshal.c
built_headers = gstswitch-marshal.h
BUILT_SOURCES = $(built_sources) $(built_headers)
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = gstswitch-marshal.list
plugin_LTLIBRARIES = libgstswitch.la
libgstswitch_la_SOURCES = gstswitch.c
nodist_libgstswitch_la_SOURCES = $(built_sources)
libgstswitch_la_CFLAGS = $(GST_CFLAGS)
libgstswitch_la_LIBADD =
libgstswitch_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS)
noinst_HEADERS = gstswitch.h $(built_headers)

View file

@ -1,4 +1,5 @@
equalizer-test equalizer-test
metadata_editor
output-selector-test
pitch-test pitch-test
v4l2src-test
videocrop-test

View file

@ -11,6 +11,7 @@ else
GST_SOUNDTOUCH_TESTS = GST_SOUNDTOUCH_TESTS =
endif endif
if USE_METADATA if USE_METADATA
if HAVE_GLADE if HAVE_GLADE
if HAVE_GTK if HAVE_GTK
@ -39,4 +40,13 @@ equalizer_test_CFLAGS = $(GST_CFLAGS)
equalizer_test_LDADD = $(GST_LIBS) equalizer_test_LDADD = $(GST_LIBS)
equalizer_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS) equalizer_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_PROGRAMS = $(GST_SOUNDTOUCH_TESTS) $(GST_METADATA_TESTS) equalizer-test
output_selector_test_SOURCES = output-selector-test.c
output_selector_test_CFLAGS = $(GST_CFLAGS)
output_selector_test_LDADD = $(GST_LIBS)
output_selector_test_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_PROGRAMS = $(GST_SOUNDTOUCH_TESTS) $(GST_METADATA_TESTS) \
equalizer-test output-selector-test

View file

@ -0,0 +1,149 @@
#include <gst/gst.h>
//[.. my_bus_callback goes here ..]
static GMainLoop *loop;
static gboolean
my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
{
g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR:{
GError *err;
gchar *debug;
gst_message_parse_error (message, &err, &debug);
g_print ("Error: %s\n", err->message);
g_error_free (err);
g_free (debug);
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_EOS:
/* end-of-stream */
g_main_loop_quit (loop);
break;
default:
/* unhandled message */
break;
}
/* we want to be notified again the next time there is a message
* on the bus, so returning TRUE (FALSE means we want to stop watching
* for messages on the bus and our callback should not be called again)
*/
return TRUE;
}
static gboolean
switch_cb (gpointer user_data)
{
GstElement *sel = GST_ELEMENT (user_data);
gchar *old_pad_name, *new_pad_name;
g_object_get (G_OBJECT (sel), "active-pad", &old_pad_name, NULL);
if (g_str_equal (old_pad_name, "src0"))
new_pad_name = "src1";
else
new_pad_name = "src0";
g_object_set (G_OBJECT (sel), "active-pad", new_pad_name, NULL);
g_print ("switched from %s to %s\n", old_pad_name, new_pad_name);
g_free (old_pad_name);
return TRUE;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline, *src, *toverlay, *osel, *sink1, *sink2, *convert;
GstPad *osel_src1, *osel_src2, *sinkpad;
GstBus *bus;
/* init GStreamer */
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* create elements */
pipeline = gst_element_factory_make ("pipeline", "pipeline");
src = gst_element_factory_make ("videotestsrc", "src");
toverlay = gst_element_factory_make ("timeoverlay", "timeoverlay");
osel = gst_element_factory_make ("output-selector", "osel");
convert = gst_element_factory_make ("ffmpegcolorspace", "convert");
sink1 = gst_element_factory_make ("xvimagesink", "sink1");
sink2 = gst_element_factory_make ("ximagesink", "sink2");
if (!pipeline || !src || !toverlay || !osel || !convert || !sink1 || !sink2) {
g_print ("missing element\n");
return -1;
}
/* add them to bin */
gst_bin_add_many (GST_BIN (pipeline), src, toverlay, osel, convert, sink1,
sink2, NULL);
/* set properties */
g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
g_object_set (G_OBJECT (src), "do-timestamp", TRUE, NULL);
g_object_set (G_OBJECT (src), "num-buffers", 500, NULL);
g_object_set (G_OBJECT (sink1), "sync", FALSE, NULL);
g_object_set (G_OBJECT (sink2), "sync", FALSE, NULL);
g_object_set (G_OBJECT (osel), "resend-latest", TRUE, NULL);
/* link src ! timeoverlay ! osel */
if (!gst_element_link_many (src, toverlay, osel, NULL)) {
g_print ("linking failed\n");
return -1;
}
/* link output 1 */
sinkpad = gst_element_get_static_pad (sink1, "sink");
osel_src1 = gst_element_get_request_pad (osel, "src%d");
if (gst_pad_link (osel_src1, sinkpad) != GST_PAD_LINK_OK) {
g_print ("linking output 1 failed\n");
return -1;
}
gst_object_unref (sinkpad);
/* link output 2 */
sinkpad = gst_element_get_static_pad (convert, "sink");
osel_src2 = gst_element_get_request_pad (osel, "src%d");
if (gst_pad_link (osel_src2, sinkpad) != GST_PAD_LINK_OK) {
g_print ("linking output 2 failed\n");
return -1;
}
gst_object_unref (sinkpad);
if (!gst_element_link (convert, sink2)) {
g_print ("linking output 2 failed\n");
return -1;
}
/* add switch callback */
g_timeout_add (1000, switch_cb, osel);
/* change to playing */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, my_bus_callback, loop);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* now run */
g_main_loop_run (loop);
/* also clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_release_request_pad (osel, osel_src1);
gst_element_release_request_pad (osel, osel_src2);
gst_object_unref (GST_OBJECT (pipeline));
return 0;
}