Merge branch 'master' into 0.11

Conflicts:
	configure.ac
This commit is contained in:
Wim Taymans 2011-02-28 11:58:05 +01:00
commit 759a3507d7
352 changed files with 20131 additions and 3417 deletions

2
.gitignore vendored
View file

@ -43,3 +43,5 @@ gst/deinterlace/tvtime.h
tmp-orc.c
*orc.h
/tests/examples/jack/jack_client

3298
ChangeLog

File diff suppressed because it is too large Load diff

105
NEWS
View file

@ -1,4 +1,107 @@
This is GStreamer Good Plug-ins 0.10.26, "Escapades"
This is GStreamer Good Plug-ins 0.10.27, "Some Kind of Temporal Blend"
Changes since 0.10.26:
* avidemux: add workaround for buggy list size; extract datetime tags
* cacasink: fix masks and strides
* deinterlace: change the default to linear
* deinterlace: avoid infinite loop draining
* deinterlace: rewrite/fix how neighboring scan lines are calculated
* flvdemux: use aac codec-data to adjust samplerate if needed
* flvmux: Fix for nellymoser codecid setting
* icydemux: Add 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag
* id3demux: fix parsing of ID3v2.4 genre frames with multiple genres
* imagefreeze: pass along eos if received before buffer arrives
* jpegdec: add "max-errors" property to ignore decoding errors
* jpegdec: avoid infinite loop when resyncing; discard incomplete image
* matroskademux: add stream-format and alignment properties for h264
* matroskademux: assume matroska if no doctype is specified
* matroskademux: increase allowed max. block size for push mode from 10M to 15M
* matroskademux: normalize empty Cues to no Cues
* matroskamux: add support for DTS and E-AC3 audio
* matroskamux: try to write timestamps in all the outgoing buffers
* multifilesink: send stream headers in key-frame mode
* multiudpsink: add buffer-size property
* navseek: add basic support to change playback rate
* pulsemixer: Implement MIXER_FLAG_AUTO_NOTIFICATIONS
* pulsesink: flush remaining buffered samples on EOS
* pulsesink: make corking during pause synchronous; don't uncork in _start
* pulsesink: Uncork stream while flushing the ringbuffer
* pulsesrc: add "client" property
* qtdemux: add support for fragmented mp4
* qtdemux: add support for (E)AC-3, WMA and VC-1 audio
* qtdemux: allow pulling atoms with unknown size
* qtdemux: fix flow return aggregation and handling of near end-of-file corner cases
* qtdemux: parse and use creation time tag from mvhd
* rtpbin: copy buffering stats
* rtpbin: correctly calculate RTCP packet size
* rtp: fix rank of payloaders and depayloaders
* rtp: flush state on flush-stop for seek handling for many (de)payloaders
* rtp ac3pay: add AC3 payloader
* rtp h264depay: determine output h264 layout using caps negotiation
* rtp h264pay: implement full bytestream scan mode
* rtp j2kdepay: add support for buffer lists; make depayloader more resilient
* rtp j2kpay: use buffer lists for better performance
* rtp j2kpay: handle EOC correctly; stop scanning when we reached the end
* rtp j2kpay: use SOP markers to split bitstream
* rtp jitterbuffer: provide a clock; get better buffering level
* rtp jpegdepay: fix framerate parsing for locales that use a comma as floating point
* rtp mp4adepay: improve timestamps on outgoing packets
* rtpsession: also emit RTCP activity on SR
* rtpsession: remember last sent RB values
* rtspsrc: add and use auto buffering mode
* rtspsrc: degrade gracefully upon failing seek and tweak QUERY_SEEKING response
* rtspsrc: include range request for all streams with non-aggregate control
* rtspsrc: increase udp buffer size
* rtspsrc: reset session manager base time when flushing
* rtspsrc: select multicast transports in a smarter way
* souphttpsrc: don't send seeks behind the end of file to the server
* v4l2sink: add navigation support; properties to control crop
* vrawdepay: fix length check
* wavparse: detect DTS advertised as PCM correctly in some more cases
* ximagesrc: change from XGetImage to XGetSubImage dependant on a property
Bugs fixed since 0.10.26:
* 596321 : qtdemux: add support for fragmented MP4 and " mfra " boxes
* 618389 : [pulsemixer] Should implement MIXER_FLAG_AUTO_NOTIFICATIONS interface
* 618652 : [effectv] Use of uninitialised value in unit test
* 620283 : Support for Adobe's F4F missing
* 621929 : [PLUGIN-MOVE] move jack plugin from -bad to -good
* 623178 : [matroskademux] error message for unrecognised FOURCC codes should be improved
* 625825 : cannot link rtpmp4adepay ! aacparse
* 629418 : progressreport: add support for determining stream position from buffer timestamps instead of using queries
* 631516 : [navseek] Add support to change playback rate
* 632654 : [matroskamux] try to write timestamps in most of the outgoing buffers
* 632897 : flvmux does not set the correct nellymoser codec id
* 633280 : [icydemux][PATCH] icydemux: Send 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag
* 634314 : pngdec hangs on faulty pngs
* 634391 : [v4l2src] add interlaced field to caps
* 634393 : v4l2src: Set top field first for interlaced captures
* 634910 : [rtph264pay] Implement bytestream scan mode
* 634928 : [qtdemux] report creation/modification time via metadata tag
* 635734 : jpegdec: infinite loop when playing back motion jpeg stream
* 636049 : ximagesrc: fix remote X and off by ones
* 636172 : imagefreeze: eos is not passed before a buffer arrives
* 636234 : [wavparse] dts 6ch played as stereo 16 bit pcm if DTS frame starts at non-zero offset
* 636621 : flvdemux: doesn't set the right sample rate for aac audio
* 636784 : [qtdemux] GST_QUERY_CONVERT implementation for qtdemux
* 637060 : matroskademux: errors out on 13MB blocks when streaming
* 637686 : [jpegenc] Improve sinkpad getcaps results
* 638019 : [matroskademux] some matroska files are not specifying DocType
* 638072 : build failure: rtpsource.c: error: 'have_rb' may be used uninitialized in this function
* 638535 : id3demux: multiple genres as per ID3v2.4 not supported correctly
* 638569 : cacasink crashes when given 15-bit video.
* 639240 : pulsesink: PLAYING- > PAUSED- > PLAYING transition causes dropout
* 639321 : deinterlace: field{1,3} scanline pointers seem to be off by one field line
* 639339 : v4l2: fails to build with older kernels due to missing V4L_FIELD_INTERLACED_{TB,BT}
* 639516 : muxers: fix setting src pad caps
* 639740 : [pulsesink] doesn't uncork in some cases during reverse playback
* 640028 : [qtdemux] crash on malformed mov stream
* 640063 : rtph264depay: leaks codec data buffer in byte-stream=false mode
* 640064 : rtspsrc memory leak
* 640080 : rtspsrc: fails to error out properly on network failure
* 623063 : [jpegdec] add " max-errors " property
Changes since 0.10.25:

255
RELEASE
View file

@ -1,5 +1,5 @@
Release notes for GStreamer Good Plug-ins 0.10.26 "Escapades"
Release notes for GStreamer Good Plug-ins 0.10.27 "Some Kind of Temporal Blend"
@ -9,8 +9,6 @@ GStreamer Good Plug-ins.
The 0.10.x series is a stable series targeted at end users.
It is not API or ABI compatible with the stable 0.8.x series.
It is, however, parallel installable with the 0.8.x series.
@ -54,125 +52,106 @@ contains a set of less supported plug-ins that haven't passed the
Features of this release
* alphacolor: make passthrough work
* avidemux: reverse playback fixes; prevent overlap of subsequent fragments
* deinterlace: remove assembly code in favor of orc
* dvdemux: parse SMPTE time codes
* flvdemux: parse and use cts (fixes jittery H.264 playback in some cases)
* flvmux: resend onMetada tag when tags changes in streamable mode
* g729pay: extend from right parent
* gconf: Don't install schemas when GConf is disabled
* goom, goom2k1: add latency compensation code, report latency correctly
* gstrtpjpegpay: Added Define Restart Interval (DRI) Marker
* h264depay: always mark the codec_data as keyframe
* icydemux: forward tag events
* id3v2mux: Add mapping for album artist
* imagefreeze: generate a perfectly timestamped stream
* level: avoid division by zero on silence
* matroskademux: more robustness for parse errors and corner-cases
* matroskademux: extract H.264 profile and level and set on caps
* matroskamux: reduce newsegment event spam and set discont flag where needed
* pulse: allow setting of pulse stream properties
* pulse: fix device_description in READY
* pulsesink: Add "client" property to set the PA client name
* pulsesink: share the PA context between all clients with the same name
* qtdemux: export AAC/MPEG-4/H.264 profile and level in caps
* rtp: add G722 payloader and depayloader elements
* rtpamr(de)pay: support AMR-WB SID frame
* rtpamrpay: proper duration for multiple frame payload; properly support perfect-rtptime
* rtpbin: add "ntp-sync" property and "use-pipeline-clock" properties
* rtpg729pay: properly support perfect-rtptime
* rtph264depay: only set delta unit on all-non-key units
* rtpmanager: provide additional statistics
* rtpmp4adepay: grab the sampling rate and put into caps
* rtpmparobustdepay: properly insert dummy buffers; use valid bitrate for dummy frame
* rtpmpvpay: fix timestamping of rtp buffers
* rtpsession: Add the option to auto-discover the RTP bandwidth
* rtpsession: Calculate RTCP bandwidth as a fraction of the RTP bandwidth
* rtpsession: Count sent RTCP packets after they have been finished
* rtpsession: relax third-party collision detection
* rtpstats: Rectify description of current_time in RTPArrivalStats
* rtspext: stop configuration on first failure
* rtspsrc: Add property to configure udpsrc buffer size
* rtspsrc: add rtsp-sdp protocol support
* rtspsrc: don't add /UDP in the transport, it's the default
* rtspsrc: fix duration reporting
* rtspsrc: handle stale digest authentication session data
* rtspsrc: use sdp uri parse method
* shapewipe: add optional border parameter and slowdown animation
* shapewipe: Force format to AYUV in the example pipeline for the same reason
* shapewipe: Force the input to AYUV to prevent negotiation failures in videomixer
* spectrum: only aggregate magnitude/phase if user asks for it, performance fixes
* v4l2src: add controllable colorbalance parameters, add decimate property
* v4l2src: fix using mpegts via the mmap interface; use GstBaseSrc::block-size as fallback size
* videomixer2: new videomixer2 element that behaves better than videomixer
* vrawdepay: handle invalid payload better
* avidemux: add workaround for buggy list size; extract datetime tags
* cacasink: fix masks and strides
* deinterlace: change the default to linear
* deinterlace: avoid infinite loop draining
* deinterlace: rewrite/fix how neighboring scan lines are calculated
* flvdemux: use aac codec-data to adjust samplerate if needed
* flvmux: Fix for nellymoser codecid setting
* icydemux: Add 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag
* id3demux: fix parsing of ID3v2.4 genre frames with multiple genres
* imagefreeze: pass along eos if received before buffer arrives
* jpegdec: add "max-errors" property to ignore decoding errors
* jpegdec: avoid infinite loop when resyncing; discard incomplete image
* matroskademux: add stream-format and alignment properties for h264
* matroskademux: assume matroska if no doctype is specified
* matroskademux: increase allowed max. block size for push mode from 10M to 15M
* matroskademux: normalize empty Cues to no Cues
* matroskamux: add support for DTS and E-AC3 audio
* matroskamux: try to write timestamps in all the outgoing buffers
* multifilesink: send stream headers in key-frame mode
* multiudpsink: add buffer-size property
* navseek: add basic support to change playback rate
* pulsemixer: Implement MIXER_FLAG_AUTO_NOTIFICATIONS
* pulsesink: flush remaining buffered samples on EOS
* pulsesink: make corking during pause synchronous; don't uncork in _start
* pulsesink: Uncork stream while flushing the ringbuffer
* pulsesrc: add "client" property
* qtdemux: add support for fragmented mp4
* qtdemux: add support for (E)AC-3, WMA and VC-1 audio
* qtdemux: allow pulling atoms with unknown size
* qtdemux: fix flow return aggregation and handling of near end-of-file corner cases
* qtdemux: parse and use creation time tag from mvhd
* rtpbin: copy buffering stats
* rtpbin: correctly calculate RTCP packet size
* rtp: fix rank of payloaders and depayloaders
* rtp: flush state on flush-stop for seek handling for many (de)payloaders
* rtp ac3pay: add AC3 payloader
* rtp h264depay: determine output h264 layout using caps negotiation
* rtp h264pay: implement full bytestream scan mode
* rtp j2kdepay: add support for buffer lists; make depayloader more resilient
* rtp j2kpay: use buffer lists for better performance
* rtp j2kpay: handle EOC correctly; stop scanning when we reached the end
* rtp j2kpay: use SOP markers to split bitstream
* rtp jitterbuffer: provide a clock; get better buffering level
* rtp jpegdepay: fix framerate parsing for locales that use a comma as floating point
* rtp mp4adepay: improve timestamps on outgoing packets
* rtpsession: also emit RTCP activity on SR
* rtpsession: remember last sent RB values
* rtspsrc: add and use auto buffering mode
* rtspsrc: degrade gracefully upon failing seek and tweak QUERY_SEEKING response
* rtspsrc: include range request for all streams with non-aggregate control
* rtspsrc: increase udp buffer size
* rtspsrc: reset session manager base time when flushing
* rtspsrc: select multicast transports in a smarter way
* souphttpsrc: don't send seeks behind the end of file to the server
* v4l2sink: add navigation support; properties to control crop
* vrawdepay: fix length check
* wavparse: detect DTS advertised as PCM correctly in some more cases
* ximagesrc: change from XGetImage to XGetSubImage dependant on a property
Bugs fixed in this release
* 596321 : qtdemux: add support for fragmented MP4 and " mfra " boxes
* 618389 : [pulsemixer] Should implement MIXER_FLAG_AUTO_NOTIFICATIONS interface
* 618652 : [effectv] Use of uninitialised value in unit test
* 620283 : Support for Adobe's F4F missing
* 621929 : [PLUGIN-MOVE] move jack plugin from -bad to -good
* 623178 : [matroskademux] error message for unrecognised FOURCC codes should be improved
* 625825 : cannot link rtpmp4adepay ! aacparse
* 629047 : segfault in seek matroskademux
* 537544 : [pulse] allow setting pa context properties
* 628996 : pulsesink broken after shared context patch (bug #624338)
* 529672 : Big latency and bad framerate while mixing multiple live streams
* 581294 : rtspext: extensions configure_stream methods conflict
* 598915 : qtdemux: propagate jpeg2000 header data in image/x-j2c
* 612313 : qtdemux: Post AAC profile/level in caps
* 616521 : qtdemux: Export MPEG-4 video profile and level in stream caps
* 617318 : matroskademux, qtdemux: Use pbutils for H.264 profile/level extraction
* 620790 : [matroskademux] general stream error when trying to play certain .mkv file
* 622390 : [v4l2] add controllable color balance properties / programmable camera
* 624338 : [pulsesink] Handle pulse context separate from the ringbuffers and share them
* 625547 : imagefreeze unit test fails occasionally
* 626048 : [videomixer] needs mode that syncs streams based on timestamps
* 626518 : [imagefreeze] better caps negotiation
* 627162 : [pulse] better fallback return value for gst_pulse_client_name()
* 627174 : [pulsesink] new property to tune the PA client name
* 627289 : souphttpsrc: tweak error messages
* 627341 : wavparse: strange handling of files less than 12 bytes
* 627796 : rtpbin: add ntp clock sync
* 628020 : [pulsesink] assertion failure in change_state NULL- > READY
* 628058 : Need a way to set the SO_RCVBUF property on rtsp-based sockets.
* 628127 : jpeg rtp payloader crashes when there is corruption in the jpeg byte stream.
* 628214 : Add support to RTSP initiation through SDP files
* 628349 : [v4l2src] Doesn't support capturing mpegts using mmap
* 628454 : Matroska demuxer doesn't handle DATE tag if it contains only a year number
* 628608 : [alphacolor] element classification is wrong
* 629018 : rtpjpegpay: unable to build because of uninitialized variable warning
* 629522 : [rtpjpegpay] add support for Define Restart Interval (DRI)
* 629839 : [qtdemux] Update xmp tags parsing
* 629896 : Error compiling raw1394 (without iec61883)
* 630088 : [flvdemux] jerky h.264 video playback
* 630205 : [icydemux] Forward tag events downstrem
* 630256 : rtph264-pay/depay: doesn't respect timestamps from incomming buffers
* 630317 : Getting pulsesink device names doesn't work like for alsasink
* 630378 : speexenc/speexdec crash with MSVC
* 630446 : rtpmanager: provide additional statistics
* 630447 : rtpsession: relax third-party collision detection
* 630449 : rtpbin: Unlock before adding pad in new_payload_found
* 630451 : rtpbin: Handle rysnc of iterator when looking for free pad name
* 630452 : rtpbin: Make cleaning up sources in rtp_session_on_timeout MT safe
* 630457 : rtpmanager: packet lost should not be a warning.
* 630458 : level: avoid division by zero on silence
* 630500 : [rtspsrc] does rtsp setup message always need " /UDP " string?
* 630888 : v4l2sink does not cope with v4l2loopback kernel module
* 631082 : rtpjitterbuffer: improve document reference
* 631303 : [goom] qos warnings if source is GstAudioSrc
* 631330 : [flvmux][PATCH] Resend updated onMetada tag when tags changes in streamable mode
* 631996 : [h264depay] regression: rtsp://stream.zoovision.com/KibaEp1n900.3gp
* 632548 : [rtspsrc] regression; fails to report duration
* 632553 : --disable-gconf still tries to install schemas
* 632682 : [matroskademux] Handle missing CodecPrivate for Vorbis/Theora
* 632945 : rtph264depay in access-unit=true mode does not aggregate the delta unit flag correctly
* 633205 : Fix for navigation events in videoflip
* 633212 : [goom] Return not-negotiated when bps is unknown
* 633970 : [icydemux] broken taglist handling
* 635532 : rtspsrc: unexpected eos when using authentication (regression)
* 635843 : [rtph264depay] segfault on empty payload
* 636179 : [deinterlace] Fields in wrong order
* 626463 : [matroskademux] " reading large block of size 14688496 not supported "
* 628894 : [matroskademux] sloppy reverse playback
* 633294 : deinterlace breaks some DVD menu scenarios
* 629418 : progressreport: add support for determining stream position from buffer timestamps instead of using queries
* 631516 : [navseek] Add support to change playback rate
* 632654 : [matroskamux] try to write timestamps in most of the outgoing buffers
* 632897 : flvmux does not set the correct nellymoser codec id
* 633280 : [icydemux][PATCH] icydemux: Send 'StreamUrl' metadata as GST_TAG_HOMEPAGE tag
* 634314 : pngdec hangs on faulty pngs
* 634391 : [v4l2src] add interlaced field to caps
* 634393 : v4l2src: Set top field first for interlaced captures
* 634910 : [rtph264pay] Implement bytestream scan mode
* 634928 : [qtdemux] report creation/modification time via metadata tag
* 635734 : jpegdec: infinite loop when playing back motion jpeg stream
* 636049 : ximagesrc: fix remote X and off by ones
* 636172 : imagefreeze: eos is not passed before a buffer arrives
* 636234 : [wavparse] dts 6ch played as stereo 16 bit pcm if DTS frame starts at non-zero offset
* 636621 : flvdemux: doesn't set the right sample rate for aac audio
* 636784 : [qtdemux] GST_QUERY_CONVERT implementation for qtdemux
* 637060 : matroskademux: errors out on 13MB blocks when streaming
* 637686 : [jpegenc] Improve sinkpad getcaps results
* 638019 : [matroskademux] some matroska files are not specifying DocType
* 638072 : build failure: rtpsource.c: error: 'have_rb' may be used uninitialized in this function
* 638535 : id3demux: multiple genres as per ID3v2.4 not supported correctly
* 638569 : cacasink crashes when given 15-bit video.
* 639240 : pulsesink: PLAYING- > PAUSED- > PLAYING transition causes dropout
* 639321 : deinterlace: field{1,3} scanline pointers seem to be off by one field line
* 639339 : v4l2: fails to build with older kernels due to missing V4L_FIELD_INTERLACED_{TB,BT}
* 639516 : muxers: fix setting src pad caps
* 639740 : [pulsesink] doesn't uncork in some cases during reverse playback
* 640028 : [qtdemux] crash on malformed mov stream
* 640063 : rtph264depay: leaks codec data buffer in byte-stream=false mode
* 640064 : rtspsrc memory leak
* 640080 : rtspsrc: fails to error out properly on network failure
* 623063 : [jpegdec] add " max-errors " property
Download
@ -202,34 +181,38 @@ Applications
Contributors to this release
* Alessandro Decina
* American Dynamics
* Andoni Morales Alastruey
* Andy Wingo
* Arun Raghavan
* Bastien Nocera
* Benjamin Gaignard
* Benjamin Otte
* Christian Schaller
* David Hoyt
* David Schleef
* Edward Hervey
* Havard Graff
* IOhannes m zmölnig
* Erich Schubert
* Guillaume Emont
* Iain Holmes
* Jan Schmidt
* Jonathan Matthew
* Janne Grunau
* Johan Dahlin
* Kishore Arepalli
* Leif Johnson
* Marc-André Lureau
* Mark Nauwelaerts
* Olivier Crête
* Pascal Buhler
* Pavel Kostyuchenko
* Philip Jägenstedt
* Philippe Normand
* René Stadler
* Robert Swain
* Paul Davis
* Rob Clark
* Ronald S. Bultje
* Sebastian Dröge
* Sjoerd Simons
* Stefan Kost
* Steve Baker
* Stéphane Loeuillet
* Tambet Ingo
* Thiago Santos
* Thibault Saunier
* Thijs Vermeir
* Thomas Vander Stichele
* Tim-Philipp Müller
* Trond Andersen
* Vladimir Eremeev
* Tom Janiszewski
* Tristan Matthews
* Vincent Penquerc'h
* Wim Taymans
* Zaheer Abbas Merali
 

2
common

@ -1 +1 @@
Subproject commit 011bcc8a0fc7f798ee874a7ba899123fb2470e22
Subproject commit 1de7f6ab2d4bc1af69f06079cf0f4e2cbbfdc178

View file

@ -748,6 +748,14 @@ AG_GST_CHECK_FEATURE(HAL, [HAL libraries], halelements, [
AG_GST_PKG_CHECK_MODULES(HAL, [hal >= 0.5.6, dbus-1 >= 0.32])
])
dnl *** Jack ***
translit(dnm, m, l) AM_CONDITIONAL(USE_JACK, true)
AG_GST_CHECK_FEATURE(JACK, Jack, jack, [
PKG_CHECK_MODULES(JACK, jack >= 0.99.10, HAVE_JACK="yes", HAVE_JACK="no")
AC_SUBST(JACK_CFLAGS)
AC_SUBST(JACK_LIBS)
])
dnl *** jpeg ***
dnl FIXME: we could use header checks here as well IMO
translit(dnm, m, l) AM_CONDITIONAL(USE_JPEG, true)
@ -1020,6 +1028,7 @@ AM_CONDITIONAL(USE_GCONFTOOL, false)
AM_CONDITIONAL(USE_GDK_PIXBUF, false)
AM_CONDITIONAL(USE_GST_V4L2, false)
AM_CONDITIONAL(USE_HAL, false)
AM_CONDITIONAL(USE_JACK, false)
AM_CONDITIONAL(USE_JPEG, false)
AM_CONDITIONAL(USE_LIBCACA, false)
AM_CONDITIONAL(USE_LIBDV, false)
@ -1144,7 +1153,6 @@ gst/wavenc/Makefile
gst/wavparse/Makefile
gst/flx/Makefile
gst/y4m/Makefile
ext/jpeg/Makefile
ext/Makefile
ext/aalib/Makefile
ext/annodex/Makefile
@ -1155,6 +1163,8 @@ ext/flac/Makefile
ext/gconf/Makefile
ext/gdk_pixbuf/Makefile
ext/hal/Makefile
ext/jack/Makefile
ext/jpeg/Makefile
ext/libcaca/Makefile
ext/libpng/Makefile
ext/pulse/Makefile
@ -1180,6 +1190,7 @@ tests/check/Makefile
tests/examples/Makefile
tests/examples/audiofx/Makefile
tests/examples/equalizer/Makefile
tests/examples/jack/Makefile
tests/examples/level/Makefile
tests/examples/pulse/Makefile
tests/examples/rtp/Makefile
@ -1236,7 +1247,7 @@ sed \
-e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.11"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.11"\n#endif/' \
-e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \
-e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \
-e "s/.* DEFAULT_AUDIOSINK$/#define DEFAULT_AUDIOSINK \"directaudiosink\"/" \
-e "s/.* DEFAULT_AUDIOSINK$/#define DEFAULT_AUDIOSINK \"directsoundsink\"/" \
-e "s/.* DEFAULT_AUDIOSRC$/#define DEFAULT_AUDIOSRC \"audiotestsrc\"/" \
-e "s/.* DEFAULT_VIDEOSRC$/#define DEFAULT_VIDEOSRC \"videotestsrc\"/" \
-e "s/.* DEFAULT_VISUALIZER$/#define DEFAULT_VISUALIZER \"goom\"/" \

View file

@ -94,6 +94,8 @@ EXTRA_HFILES = \
$(top_srcdir)/ext/gdk_pixbuf/gstgdkpixbufsink.h \
$(top_srcdir)/ext/hal/gsthalaudiosink.h \
$(top_srcdir)/ext/hal/gsthalaudiosrc.h \
$(top_srcdir)/ext/jack/gstjackaudiosrc.h \
$(top_srcdir)/ext/jack/gstjackaudiosink.h \
$(top_srcdir)/ext/jpeg/gstjpegdec.h \
$(top_srcdir)/ext/jpeg/gstjpegenc.h \
$(top_srcdir)/ext/jpeg/gstsmokedec.h \

View file

@ -94,6 +94,8 @@
<xi:include href="xml/element-id3v2mux.xml" />
<xi:include href="xml/element-imagefreeze.xml" />
<xi:include href="xml/element-interleave.xml" />
<xi:include href="xml/element-jackaudiosrc.xml" />
<xi:include href="xml/element-jackaudiosink.xml" />
<xi:include href="xml/element-jpegdec.xml" />
<xi:include href="xml/element-jpegenc.xml" />
<xi:include href="xml/element-level.xml" />
@ -206,6 +208,7 @@
<xi:include href="xml/plugin-id3demux.xml" />
<xi:include href="xml/plugin-imagefreeze.xml" />
<xi:include href="xml/plugin-interleave.xml" />
<xi:include href="xml/plugin-jack.xml" />
<xi:include href="xml/plugin-jpeg.xml" />
<xi:include href="xml/plugin-level.xml" />
<xi:include href="xml/plugin-matroska.xml" />

View file

@ -1113,6 +1113,36 @@ GstInterleaveFunc
gst_interleave_get_type
</SECTION>
<SECTION>
<FILE>element-jackaudiosrc</FILE>
<TITLE>jackaudiosrc</TITLE>
GstJackAudioSrc
<SUBSECTION Standard>
GstJackAudioSrcClass
GST_JACK_AUDIO_SRC
GST_JACK_AUDIO_SRC_CLASS
GST_JACK_AUDIO_SRC_GET_CLASS
GST_IS_JACK_AUDIO_SRC
GST_IS_JACK_AUDIO_SRC_CLASS
GST_TYPE_JACK_AUDIO_SRC
gst_jack_audio_src_get_type
</SECTION>
<SECTION>
<FILE>element-jackaudiosink</FILE>
<TITLE>jackaudiosink</TITLE>
GstJackAudioSink
<SUBSECTION Standard>
GstJackAudioSinkClass
GST_JACK_AUDIO_SINK
GST_JACK_AUDIO_SINK_CLASS
GST_JACK_AUDIO_SINK_GET_CLASS
GST_IS_JACK_AUDIO_SINK
GST_IS_JACK_AUDIO_SINK_CLASS
GST_TYPE_JACK_AUDIO_SINK
gst_jack_audio_sink_get_type
</SECTION>
<SECTION>
<FILE>element-jpegdec</FILE>
<TITLE>jpegdec</TITLE>

View file

@ -745,7 +745,7 @@
<FLAGS>rw</FLAGS>
<NICK>Buffer Mode</NICK>
<BLURB>Control the buffering algorithm in use.</BLURB>
<DEFAULT>Slave receiver to sender clock</DEFAULT>
<DEFAULT>Choose mode depending on stream live</DEFAULT>
</ARG>
<ARG>
@ -765,7 +765,7 @@
<FLAGS>rw</FLAGS>
<NICK>UDP Buffer Size</NICK>
<BLURB>Size of the kernel UDP receive buffer in bytes, 0=default.</BLURB>
<DEFAULT>0</DEFAULT>
<DEFAULT>524288</DEFAULT>
</ARG>
<ARG>
@ -1998,6 +1998,16 @@
<DEFAULT>"auto"</DEFAULT>
</ARG>
<ARG>
<NAME>GstProgressReport::do-query</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Use a query instead of buffer metadata to determine stream position</NICK>
<BLURB>Use a query instead of buffer metadata to determine stream position.</BLURB>
<DEFAULT>TRUE</DEFAULT>
</ARG>
<ARG>
<NAME>GstNavSeek::seek-offset</NAME>
<TYPE>gdouble</TYPE>
@ -2518,6 +2528,16 @@
<DEFAULT>TRUE</DEFAULT>
</ARG>
<ARG>
<NAME>GstMultiUDPSink::buffer-size</NAME>
<TYPE>gint</TYPE>
<RANGE>>= 0</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Buffer Size</NICK>
<BLURB>Size of the kernel send buffer in bytes, 0=default.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstCmmlDec::wait-clip-end-time</NAME>
<TYPE>gboolean</TYPE>
@ -2688,6 +2708,16 @@
<DEFAULT>TRUE</DEFAULT>
</ARG>
<ARG>
<NAME>GstXImageSrc::remote</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Remote dispay</NICK>
<BLURB>Whether the display is remote.</BLURB>
<DEFAULT>FALSE</DEFAULT>
</ARG>
<ARG>
<NAME>GstVideoBalance::brightness</NAME>
<TYPE>gdouble</TYPE>
@ -2768,6 +2798,16 @@
<DEFAULT>Faster, less accurate integer method</DEFAULT>
</ARG>
<ARG>
<NAME>GstJpegDec::max-errors</NAME>
<TYPE>gint</TYPE>
<RANGE>>= G_MAXULONG</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Maximum Consecutive Decoding Errors</NICK>
<BLURB>Error out after receiving N consecutive decoding errors (-1 = never fail, 0 = automatic, 1 = fail on first error).</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstRTPiLBCDepay::mode</NAME>
<TYPE>iLBCMode</TYPE>
@ -19674,7 +19714,7 @@
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Byte Stream</NICK>
<BLURB>Generate byte stream format of NALU.</BLURB>
<BLURB>Generate byte stream format of NALU (deprecated; use caps).</BLURB>
<DEFAULT>TRUE</DEFAULT>
</ARG>
@ -19684,7 +19724,7 @@
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Access Unit</NICK>
<BLURB>Merge NALU into AU (picture).</BLURB>
<BLURB>Merge NALU into AU (picture) (deprecated; use caps).</BLURB>
<DEFAULT>FALSE</DEFAULT>
</ARG>
@ -19838,6 +19878,16 @@
<DEFAULT></DEFAULT>
</ARG>
<ARG>
<NAME>GstPulseSrc::client</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Client</NICK>
<BLURB>The PulseAudio client_name_to_use.</BLURB>
<DEFAULT>"<unknown>"</DEFAULT>
</ARG>
<ARG>
<NAME>GstPulseMixer::device</NAME>
<TYPE>gchar*</TYPE>
@ -20315,7 +20365,7 @@
<FLAGS>rw</FLAGS>
<NICK>Method</NICK>
<BLURB>Deinterlace Method.</BLURB>
<DEFAULT>Motion Adaptive: Advanced Detection</DEFAULT>
<DEFAULT>Television: Full resolution</DEFAULT>
</ARG>
<ARG>
@ -20805,7 +20855,7 @@
<FLAGS>rw</FLAGS>
<NICK>Queue size</NICK>
<BLURB>Number of buffers to be enqueud in the driver in streaming mode.</BLURB>
<DEFAULT>8</DEFAULT>
<DEFAULT>12</DEFAULT>
</ARG>
<ARG>
@ -20848,6 +20898,56 @@
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstV4l2Sink::crop-height</NAME>
<TYPE>guint</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Crop height</NICK>
<BLURB>The height of the video crop; default is equal to negotiated image height.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstV4l2Sink::crop-left</NAME>
<TYPE>gint</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Crop left</NICK>
<BLURB>The leftmost (x) coordinate of the video crop; top left corner of image is 0,0.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstV4l2Sink::crop-top</NAME>
<TYPE>gint</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Crop top</NICK>
<BLURB>The topmost (y) coordinate of the video crop; top left corner of image is 0,0.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstV4l2Sink::crop-width</NAME>
<TYPE>guint</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Crop width</NICK>
<BLURB>The width of the video crop; default is equal to negotiated image width.</BLURB>
<DEFAULT>0</DEFAULT>
</ARG>
<ARG>
<NAME>GstV4l2Sink::min-queued-bufs</NAME>
<TYPE>guint</TYPE>
<RANGE><= 16</RANGE>
<FLAGS>rw</FLAGS>
<NICK>Minimum queued bufs</NICK>
<BLURB>Minimum number of queued bufs; v4l2sink won't dqbuf if the driver doesn't have more than this number (which normally you shouldn't change).</BLURB>
<DEFAULT>1</DEFAULT>
</ARG>
<ARG>
<NAME>GstShapeWipe::border</NAME>
<TYPE>gfloat</TYPE>
@ -21018,3 +21118,83 @@
<DEFAULT>Checker pattern</DEFAULT>
</ARG>
<ARG>
<NAME>GstRtpJ2KPay::buffer-list</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Buffer List</NICK>
<BLURB>Use Buffer Lists.</BLURB>
<DEFAULT>TRUE</DEFAULT>
</ARG>
<ARG>
<NAME>GstRtpJ2KDepay::buffer-list</NAME>
<TYPE>gboolean</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Buffer List</NICK>
<BLURB>Use Buffer Lists.</BLURB>
<DEFAULT>TRUE</DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSrc::client</NAME>
<TYPE>JackClient*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>JackClient</NICK>
<BLURB>Handle for jack client.</BLURB>
<DEFAULT></DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSrc::connect</NAME>
<TYPE>GstJackConnect</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Connect</NICK>
<BLURB>Specify how the input ports will be connected.</BLURB>
<DEFAULT>Automatically connect ports to physical ports</DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSrc::server</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Server</NICK>
<BLURB>The Jack server to connect to (NULL = default).</BLURB>
<DEFAULT>NULL</DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSink::client</NAME>
<TYPE>JackClient*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>JackClient</NICK>
<BLURB>Handle for jack client.</BLURB>
<DEFAULT></DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSink::connect</NAME>
<TYPE>GstJackConnect</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Connect</NICK>
<BLURB>Specify how the output ports will be connected.</BLURB>
<DEFAULT>Automatically connect ports to physical ports</DEFAULT>
</ARG>
<ARG>
<NAME>GstJackAudioSink::server</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
<FLAGS>rw</FLAGS>
<NICK>Server</NICK>
<BLURB>The Jack server to connect to (NULL = default).</BLURB>
<DEFAULT>NULL</DEFAULT>
</ARG>

View file

@ -30,6 +30,7 @@ GObject
GstRtpG723Depay
GstRtpG726Depay
GstRtpG729Depay
GstRtpGSTDepay
GstRtpH263Depay
GstRtpH263PDepay
GstRtpH264Depay
@ -70,8 +71,10 @@ GObject
GstRTPGSMPay
GstRTPMP2TPay
GstRTPMPVPay
GstRtpAC3Pay
GstRtpAMRPay
GstRtpCELTPay
GstRtpGSTPay
GstRtpH263PPay
GstRtpH263Pay
GstRtpH264Pay
@ -92,6 +95,7 @@ GObject
GstEsdSink
GstOss4Sink
GstOssSink
GstJackAudioSink
GstPulseSink
GstCACASink
GstDynUDPSink
@ -110,6 +114,7 @@ GObject
GstOss4Source
GstOssSrc
GstPulseSrc
GstJackAudioSrc
GstDV1394Src
GstHDV1394Src
GstMultiFileSrc
@ -218,6 +223,7 @@ GObject
GstMatroskaDemux
GstMatroskaMux
GstWebMMux
GstMonoscope
GstMuLawDec
GstMuLawEnc
GstMultipartDemux
@ -269,6 +275,8 @@ GObject
GstRingBuffer
GstAudioSinkRingBuffer
GstAudioSrcRingBuffer
GstJackAudioSinkRingBuffer
GstJackAudioSrcRingBuffer
GstTask
GstTaskPool
GstSignalObject
@ -282,6 +290,7 @@ GInterface
GstColorBalance
GstImplementsInterface
GstMixer
GstNavigation
GstPreset
GstPropertyProbe
GstStreamVolume
@ -289,3 +298,4 @@ GInterface
GstTuner
GstURIHandler
GstVideoOrientation
GstXOverlay

View file

@ -19,7 +19,7 @@ GstRgVolume GstChildProxy
GstAspectRatioCrop GstChildProxy
GstPulseSink GstStreamVolume GstImplementsInterface GstPropertyProbe
GstOss4Sink GstStreamVolume GstPropertyProbe
GstV4l2Sink GstImplementsInterface GstColorBalance GstVideoOrientation GstPropertyProbe
GstV4l2Sink GstImplementsInterface GstXOverlay GstNavigation GstColorBalance GstVideoOrientation GstPropertyProbe
GstShout2send GstTagSetter
GstUDPSink GstURIHandler
GstDV1394Src GstURIHandler GstPropertyProbe

View file

@ -6,4 +6,5 @@ GstMixer GstImplementsInterface GstElement
GstTuner GstImplementsInterface GstElement
GstColorBalance GstImplementsInterface GstElement
GstVideoOrientation GstImplementsInterface GstElement
GstXOverlay GstImplementsInterface GstElement
GIcon GObject

View file

@ -3,7 +3,7 @@
<description>Source for video data via IEEE1394 interface</description>
<filename>../../ext/raw1394/.libs/libgst1394.so</filename>
<basename>libgst1394.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>ASCII Art video sink</description>
<filename>../../ext/aalib/.libs/libgstaasink.so</filename>
<basename>libgstaasink.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>ALaw audio conversion routines</description>
<filename>../../gst/law/.libs/libgstalaw.so</filename>
<basename>libgstalaw.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>adds an alpha channel to video - constant or via chroma-keying</description>
<filename>../../gst/alpha/.libs/libgstalpha.so</filename>
<basename>libgstalpha.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>RGBA from/to AYUV colorspace conversion preserving the alpha channel</description>
<filename>../../gst/alpha/.libs/libgstalphacolor.so</filename>
<basename>libgstalphacolor.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>annodex stream manipulation (info about annodex: http://www.annodex.net)</description>
<filename>../../ext/annodex/.libs/libgstannodex.so</filename>
<basename>libgstannodex.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>APEv1/2 tag reader</description>
<filename>../../gst/apetag/.libs/libgstapetag.so</filename>
<basename>libgstapetag.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Audio effects plugin</description>
<filename>../../gst/audiofx/.libs/libgstaudiofx.so</filename>
<basename>libgstaudiofx.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>parses au streams</description>
<filename>../../gst/auparse/.libs/libgstauparse.so</filename>
<basename>libgstauparse.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Plugin contains auto-detection plugins for video/audio in- and outputs</description>
<filename>../../gst/autodetect/.libs/libgstautodetect.so</filename>
<basename>libgstautodetect.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>AVI stream handling</description>
<filename>../../gst/avi/.libs/libgstavi.so</filename>
<basename>libgstavi.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Colored ASCII Art video sink</description>
<filename>../../ext/libcaca/.libs/libgstcacasink.so</filename>
<basename>libgstcacasink.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Cairo-based elements</description>
<filename>../../ext/cairo/.libs/libgstcairo.so</filename>
<basename>libgstcairo.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Audio Cutter to split audio into non-silent bits</description>
<filename>../../gst/cutter/.libs/libgstcutter.so</filename>
<basename>libgstcutter.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>elements for testing and debugging</description>
<filename>../../gst/debugutils/.libs/libgstdebug.so</filename>
<basename>libgstdebug.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Deinterlacer</description>
<filename>../../gst/deinterlace/.libs/libgstdeinterlace.so</filename>
<basename>libgstdeinterlace.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>
@ -12,7 +12,7 @@
<element>
<name>deinterlace</name>
<longname>Deinterlacer</longname>
<class>Filter/Video</class>
<class>Filter/Effect/Video/Deinterlace</class>
<description>Deinterlace Methods ported from DScaler/TvTime</description>
<author>Martin Eikermann &lt;meiker@upb.de&gt;, Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
<pads>

View file

@ -3,7 +3,7 @@
<description>DV demuxer and decoder based on libdv (libdv.sf.net)</description>
<filename>../../ext/dv/.libs/libgstdv.so</filename>
<basename>libgstdv.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>This element converts a stream of normal GStreamer buffers into a stream of buffers that are allocated in such a way that out-of-bounds access to data in the buffer is more likely to cause segmentation faults. This allocation method is very similar to the debugging tool &quot;Electric Fence&quot;.</description>
<filename>../../gst/debugutils/.libs/libgstefence.so</filename>
<basename>libgstefence.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>effect plugins from the effectv project</description>
<filename>../../gst/effectv/.libs/libgsteffectv.so</filename>
<basename>libgsteffectv.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>GStreamer audio equalizers</description>
<filename>../../gst/equalizer/.libs/libgstequalizer.so</filename>
<basename>libgstequalizer.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>ESD Element Plugins</description>
<filename>../../ext/esd/.libs/libgstesd.so</filename>
<basename>libgstesd.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>The FLAC Lossless compressor Codec</description>
<filename>../../ext/flac/.libs/libgstflac.so</filename>
<basename>libgstflac.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>FLV muxing and demuxing plugin</description>
<filename>../../gst/flv/.libs/libgstflv.so</filename>
<basename>libgstflv.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>FLC/FLI/FLX video decoder</description>
<filename>../../gst/flx/.libs/libgstflxdec.so</filename>
<basename>libgstflxdec.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>elements wrapping the GStreamer/GConf audio/video output settings</description>
<filename>../../ext/gconf/.libs/libgstgconfelements.so</filename>
<basename>libgstgconfelements.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>GdkPixbuf-based image decoder, scaler and sink</description>
<filename>../../ext/gdk_pixbuf/.libs/libgstgdkpixbuf.so</filename>
<basename>libgstgdkpixbuf.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>GOOM visualization filter</description>
<filename>../../gst/goom/.libs/libgstgoom.so</filename>
<basename>libgstgoom.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>GOOM 2k1 visualization filter</description>
<filename>../../gst/goom2k1/.libs/libgstgoom2k1.so</filename>
<basename>libgstgoom2k1.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>RTP session management plugin library</description>
<filename>../../gst/rtpmanager/.libs/libgstrtpmanager.so</filename>
<basename>libgstrtpmanager.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>elements wrapping the GStreamer/HAL audio input/output devices</description>
<filename>../../ext/hal/.libs/libgsthalelements.so</filename>
<basename>libgsthalelements.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Demux ICY tags from a stream</description>
<filename>../../gst/icydemux/.libs/libgsticydemux.so</filename>
<basename>libgsticydemux.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Demux ID3v1 and ID3v2 tags from a file</description>
<filename>../../gst/id3demux/.libs/libgstid3demux.so</filename>
<basename>libgstid3demux.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Still frame stream generator</description>
<filename>../../gst/imagefreeze/.libs/libgstimagefreeze.so</filename>
<basename>libgstimagefreeze.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Audio interleaver/deinterleaver</description>
<filename>../../gst/interleave/.libs/libgstinterleave.so</filename>
<basename>libgstinterleave.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -0,0 +1,43 @@
<plugin>
<name>jack</name>
<description>JACK audio elements</description>
<filename>../../ext/jack/.libs/libgstjack.so</filename>
<basename>libgstjack.so</basename>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>
<name>jackaudiosink</name>
<longname>Audio Sink (Jack)</longname>
<class>Sink/Audio</class>
<description>Output audio to a JACK server</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
</caps>
</pads>
</element>
<element>
<name>jackaudiosrc</name>
<longname>Audio Source (Jack)</longname>
<class>Source/Audio</class>
<description>Captures audio from a JACK server</description>
<author>Tristan Matthews &lt;tristan@sat.qc.ca&gt;</author>
<pads>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>audio/x-raw-float, endianness=(int)1234, width=(int)32, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
</caps>
</pads>
</element>
</elements>
</plugin>

View file

@ -3,7 +3,7 @@
<description>JPeg plugin library</description>
<filename>../../ext/jpeg/.libs/libgstjpeg.so</filename>
<basename>libgstjpeg.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Audio level plugin</description>
<filename>../../gst/level/.libs/libgstlevel.so</filename>
<basename>libgstlevel.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Matroska and WebM stream handling</description>
<filename>../../gst/matroska/.libs/libgstmatroska.so</filename>
<basename>libgstmatroska.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>
@ -53,13 +53,13 @@
<name>audio_%d</name>
<direction>sink</direction>
<presence>request</presence>
<details>audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], stream-format=(string){ raw }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-ac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-flac, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-speex, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean)false, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)[ 32, 64 ], endianness=(int)1234, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-tta, width=(int){ 8, 16, 24 }, channels=(int){ 1, 2 }, rate=(int)[ 8000, 96000 ]; audio/x-pn-realaudio, raversion=(int){ 1, 2, 8 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)[ 1, 3 ], block_align=(int)[ 0, 65535 ], bitrate=(int)[ 0, 524288 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]</details>
<details>audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], stream-format=(string){ raw }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-ac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-eac3, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-dts, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-vorbis, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-flac, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-speex, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean)false, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)24, depth=(int)24, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-int, width=(int)32, depth=(int)32, endianness=(int){ 4321, 1234 }, signed=(boolean)true, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-raw-float, width=(int)[ 32, 64 ], endianness=(int)1234, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-tta, width=(int){ 8, 16, 24 }, channels=(int){ 1, 2 }, rate=(int)[ 8000, 96000 ]; audio/x-pn-realaudio, raversion=(int){ 1, 2, 8 }, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]; audio/x-wma, wmaversion=(int)[ 1, 3 ], block_align=(int)[ 0, 65535 ], bitrate=(int)[ 0, 524288 ], channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ]</details>
</caps>
<caps>
<name>subtitle_%d</name>
<direction>sink</direction>
<presence>request</presence>
<details>ANY</details>
<details>subtitle/x-kate</details>
</caps>
<caps>
<name>video_%d</name>

View file

@ -3,10 +3,10 @@
<description>Monoscope visualization</description>
<filename>../../gst/monoscope/.libs/libgstmonoscope.so</filename>
<basename>libgstmonoscope.so</basename>
<version>0.10.24.5</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins prerelease</package>
<package>GStreamer Good Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,7 +3,7 @@
<description>MuLaw audio conversion routines</description>
<filename>../../gst/law/.libs/libgstmulaw.so</filename>
<basename>libgstmulaw.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Reads/Writes buffers from/to sequentially named files</description>
<filename>../../gst/multifile/.libs/libgstmultifile.so</filename>
<basename>libgstmultifile.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>multipart stream manipulation</description>
<filename>../../gst/multipart/.libs/libgstmultipart.so</filename>
<basename>libgstmultipart.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Template for a video filter</description>
<filename>../../gst/debugutils/.libs/libgstnavigationtest.so</filename>
<basename>libgstnavigationtest.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Open Sound System (OSS) version 4 support for GStreamer</description>
<filename>../../sys/oss4/.libs/libgstoss4audio.so</filename>
<basename>libgstoss4audio.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>OSS (Open Sound System) support for GStreamer</description>
<filename>../../sys/oss/.libs/libgstossaudio.so</filename>
<basename>libgstossaudio.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>PNG plugin library</description>
<filename>../../ext/libpng/.libs/libgstpng.so</filename>
<basename>libgstpng.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>PulseAudio plugin library</description>
<filename>../../ext/pulse/.libs/libgstpulse.so</filename>
<basename>libgstpulse.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Quicktime support</description>
<filename>../../gst/qtdemux/.libs/libgstqtdemux.so</filename>
<basename>libgstqtdemux.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>ReplayGain volume normalization</description>
<filename>../../gst/replaygain/.libs/libgstreplaygain.so</filename>
<basename>libgstreplaygain.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Real-time protocol plugins</description>
<filename>../../gst/rtp/.libs/libgstrtp.so</filename>
<basename>libgstrtp.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>
@ -12,7 +12,7 @@
<element>
<name>asteriskh263</name>
<longname>RTP Asterisk H263 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts H263 video from RTP and encodes in Asterisk H263 format</description>
<author>Neil Stratford &lt;neils@vipadia.com&gt;</author>
<pads>
@ -33,7 +33,7 @@
<element>
<name>rtpL16depay</name>
<longname>RTP audio depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts raw audio from RTP packets</description>
<author>Zeeshan Ali &lt;zak147@yahoo.com&gt;,Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -54,7 +54,7 @@
<element>
<name>rtpL16pay</name>
<longname>RTP audio payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode Raw audio into RTP packets (RFC 3551)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -75,7 +75,7 @@
<element>
<name>rtpac3depay</name>
<longname>RTP AC3 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts AC3 audio from RTP packets (RFC 4184)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -93,10 +93,31 @@
</caps>
</pads>
</element>
<element>
<name>rtpac3pay</name>
<longname>RTP AC3 audio payloader</longname>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload AC3 audio as RTP packets (RFC 4184)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>audio/ac3; audio/x-ac3</details>
</caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>application/x-rtp, media=(string)audio, payload=(int)[ 96, 127 ], clock-rate=(int){ 32000, 44100, 48000 }, encoding-name=(string)AC3</details>
</caps>
</pads>
</element>
<element>
<name>rtpamrdepay</name>
<longname>RTP AMR depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -117,7 +138,7 @@
<element>
<name>rtpamrpay</name>
<longname>RTP AMR payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -138,7 +159,7 @@
<element>
<name>rtpbvdepay</name>
<longname>RTP BroadcomVoice depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts BroadcomVoice audio from RTP packets (RFC 4298)</description>
<author>Wim Taymans &lt;wim.taymans@collabora.co.uk&gt;</author>
<pads>
@ -159,7 +180,7 @@
<element>
<name>rtpbvpay</name>
<longname>RTP BV Payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Packetize BroadcomVoice audio streams into RTP packets (RFC 4298)</description>
<author>Wim Taymans &lt;wim.taymans@collabora.co.uk&gt;</author>
<pads>
@ -180,7 +201,7 @@
<element>
<name>rtpceltdepay</name>
<longname>RTP CELT depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts CELT audio from RTP packets</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -201,7 +222,7 @@
<element>
<name>rtpceltpay</name>
<longname>RTP CELT payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes CELT audio into a RTP packet</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -222,7 +243,7 @@
<element>
<name>rtpdepay</name>
<longname>Dummy RTP session manager</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Accepts raw RTP and RTCP packets and sends them forward</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -255,7 +276,7 @@
<element>
<name>rtpdvdepay</name>
<longname>RTP DV Depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Depayloads DV from RTP packets (RFC 3189)</description>
<author>Marcel Moreaux &lt;marcelm@spacelabs.nl&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -276,7 +297,7 @@
<element>
<name>rtpdvpay</name>
<longname>RTP DV Payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payloads DV into RTP packets (RFC 3189)</description>
<author>Marcel Moreaux &lt;marcelm@spacelabs.nl&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -297,7 +318,7 @@
<element>
<name>rtpg722depay</name>
<longname>RTP audio depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts G722 audio from RTP packets</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -318,7 +339,7 @@
<element>
<name>rtpg722pay</name>
<longname>RTP audio payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode Raw audio into RTP packets (RFC 3551)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -339,7 +360,7 @@
<element>
<name>rtpg723depay</name>
<longname>RTP G.723 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts G.723 audio from RTP packets (RFC 3551)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -360,7 +381,7 @@
<element>
<name>rtpg723pay</name>
<longname>RTP G.723 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Packetize G.723 audio into RTP packets</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -381,7 +402,7 @@
<element>
<name>rtpg726depay</name>
<longname>RTP G.726 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts G.726 audio from RTP packets</description>
<author>Axis Communications &lt;dev-gstreamer@axis.com&gt;</author>
<pads>
@ -402,7 +423,7 @@
<element>
<name>rtpg726pay</name>
<longname>RTP G.726 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes G.726 audio into a RTP packet</description>
<author>Axis Communications &lt;dev-gstreamer@axis.com&gt;</author>
<pads>
@ -423,7 +444,7 @@
<element>
<name>rtpg729depay</name>
<longname>RTP G.729 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts G.729 audio from RTP packets (RFC 3551)</description>
<author>Laurent Glayal &lt;spglegle@yahoo.fr&gt;</author>
<pads>
@ -444,7 +465,7 @@
<element>
<name>rtpg729pay</name>
<longname>RTP G.729 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Packetize G.729 audio into RTP packets</description>
<author>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</author>
<pads>
@ -465,7 +486,7 @@
<element>
<name>rtpgsmdepay</name>
<longname>RTP GSM depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts GSM audio from RTP packets</description>
<author>Zeeshan Ali &lt;zeenix@gmail.com&gt;</author>
<pads>
@ -486,7 +507,7 @@
<element>
<name>rtpgsmpay</name>
<longname>RTP GSM payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes GSM audio into a RTP packet</description>
<author>Zeeshan Ali &lt;zeenix@gmail.com&gt;</author>
<pads>
@ -504,10 +525,52 @@
</caps>
</pads>
</element>
<element>
<name>rtpgstdepay</name>
<longname>GStreamer depayloader</longname>
<class>Codec/Depayloader/Network</class>
<description>Extracts GStreamer buffers from RTP packets</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST</details>
</caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>ANY</details>
</caps>
</pads>
</element>
<element>
<name>rtpgstpay</name>
<longname>RTP GStreamer payloader</longname>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload GStreamer buffers as RTP packets</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
<caps>
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>ANY</details>
</caps>
<caps>
<name>src</name>
<direction>source</direction>
<presence>always</presence>
<details>application/x-rtp, media=(string)application, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)X-GST</details>
</caps>
</pads>
</element>
<element>
<name>rtph263depay</name>
<longname>RTP H263 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts H263 video from RTP packets (RFC 2190)</description>
<author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;, Edward Hervey &lt;bilboed@bilboed.com&gt;</author>
<pads>
@ -528,7 +591,7 @@
<element>
<name>rtph263pay</name>
<longname>RTP H263 packet payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes H263 video in RTP packets (RFC 2190)</description>
<author>Neil Stratford &lt;neils@vipadia.com&gt;Dejan Sakelsak &lt;dejan.sakelsak@marand.si&gt;</author>
<pads>
@ -549,7 +612,7 @@
<element>
<name>rtph263pdepay</name>
<longname>RTP H263 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts H263/+/++ video from RTP packets (RFC 4629)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -570,7 +633,7 @@
<element>
<name>rtph263ppay</name>
<longname>RTP H263 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes H263/+/++ video in RTP packets (RFC 4629)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -591,7 +654,7 @@
<element>
<name>rtph264depay</name>
<longname>RTP H264 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts H264 video from RTP packets (RFC 3984)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -612,7 +675,7 @@
<element>
<name>rtph264pay</name>
<longname>RTP H264 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode H264 video into RTP packets (RFC 3984)</description>
<author>Laurent Glayal &lt;spglegle@yahoo.fr&gt;</author>
<pads>
@ -633,7 +696,7 @@
<element>
<name>rtpilbcdepay</name>
<longname>RTP iLBC depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts iLBC audio from RTP packets (RFC 3952)</description>
<author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;</author>
<pads>
@ -654,7 +717,7 @@
<element>
<name>rtpilbcpay</name>
<longname>RTP iLBC Payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Packetize iLBC audio streams into RTP packets</description>
<author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;</author>
<pads>
@ -675,7 +738,7 @@
<element>
<name>rtpj2kdepay</name>
<longname>RTP JPEG 2000 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts JPEG 2000 video from RTP packets (RFC 5371)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -696,7 +759,7 @@
<element>
<name>rtpj2kpay</name>
<longname>RTP JPEG 2000 payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes JPEG 2000 pictures into RTP packets (RFC 5371)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -717,7 +780,7 @@
<element>
<name>rtpjpegdepay</name>
<longname>RTP JPEG depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts JPEG video from RTP packets (RFC 2435)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -738,7 +801,7 @@
<element>
<name>rtpjpegpay</name>
<longname>RTP JPEG payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes JPEG pictures into RTP packets (RFC 2435)</description>
<author>Axis Communications &lt;dev-gstreamer@axis.com&gt;</author>
<pads>
@ -759,7 +822,7 @@
<element>
<name>rtpmp1sdepay</name>
<longname>RTP MPEG1 System Stream depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG1 System Streams from RTP packets (RFC 3555)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -780,7 +843,7 @@
<element>
<name>rtpmp2tdepay</name>
<longname>RTP MPEG Transport Stream depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG2 TS from RTP packets (RFC 2250)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;, Thijs Vermeir &lt;thijs.vermeir@barco.com&gt;</author>
<pads>
@ -801,7 +864,7 @@
<element>
<name>rtpmp2tpay</name>
<longname>RTP MPEG2 Transport Stream payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes MPEG2 TS into RTP packets (RFC 2250)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -822,7 +885,7 @@
<element>
<name>rtpmp4adepay</name>
<longname>RTP MPEG4 audio depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG4 audio from RTP packets (RFC 3016)</description>
<author>Nokia Corporation (contact &lt;stefan.kost@nokia.com&gt;), Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -843,7 +906,7 @@
<element>
<name>rtpmp4apay</name>
<longname>RTP MPEG4 audio payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload MPEG4 audio as RTP packets (RFC 3016)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -864,7 +927,7 @@
<element>
<name>rtpmp4gdepay</name>
<longname>RTP MPEG4 ES depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG4 elementary streams from RTP packets (RFC 3640)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -885,7 +948,7 @@
<element>
<name>rtpmp4gpay</name>
<longname>RTP MPEG4 ES payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload MPEG4 elementary streams as RTP packets (RFC 3640)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -906,7 +969,7 @@
<element>
<name>rtpmp4vdepay</name>
<longname>RTP MPEG4 video depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG4 video from RTP packets (RFC 3016)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -927,7 +990,7 @@
<element>
<name>rtpmp4vpay</name>
<longname>RTP MPEG4 Video payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload MPEG-4 video as RTP packets (RFC 3016)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -935,7 +998,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
<details>video/mpeg, mpegversion=(int)4, systemstream=(boolean)false</details>
<details>video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-xvid</details>
</caps>
<caps>
<name>src</name>
@ -948,7 +1011,7 @@
<element>
<name>rtpmpadepay</name>
<longname>RTP MPEG audio depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG audio from RTP packets (RFC 2038)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -969,7 +1032,7 @@
<element>
<name>rtpmpapay</name>
<longname>RTP MPEG audio payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload MPEG audio as RTP packets (RFC 2038)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -990,7 +1053,7 @@
<element>
<name>rtpmparobustdepay</name>
<longname>RTP MPEG audio depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG audio from RTP packets (RFC 5219)</description>
<author>Mark Nauwelaerts &lt;mark.nauwelaerts@collabora.co.uk&gt;</author>
<pads>
@ -1011,7 +1074,7 @@
<element>
<name>rtpmpvdepay</name>
<longname>RTP MPEG video depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts MPEG video from RTP packets (RFC 2250)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1032,7 +1095,7 @@
<element>
<name>rtpmpvpay</name>
<longname>RTP MPEG2 ES video payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes MPEG2 ES into RTP packets (RFC 2250)</description>
<author>Thijs Vermeir &lt;thijsvermeir@gmail.com&gt;</author>
<pads>
@ -1053,7 +1116,7 @@
<element>
<name>rtppcmadepay</name>
<longname>RTP PCMA depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts PCMA audio from RTP packets</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;, Zeeshan Ali &lt;zeenix@gmail.com&gt;</author>
<pads>
@ -1074,7 +1137,7 @@
<element>
<name>rtppcmapay</name>
<longname>RTP PCMA payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes PCMA audio into a RTP packet</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads>
@ -1095,7 +1158,7 @@
<element>
<name>rtppcmudepay</name>
<longname>RTP PCMU depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts PCMU audio from RTP packets</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;, Zeeshan Ali &lt;zeenix@gmail.com&gt;</author>
<pads>
@ -1116,7 +1179,7 @@
<element>
<name>rtppcmupay</name>
<longname>RTP PCMU payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes PCMU audio into a RTP packet</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads>
@ -1137,7 +1200,7 @@
<element>
<name>rtpqcelpdepay</name>
<longname>RTP QCELP depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts QCELP (PureVoice) audio from RTP packets (RFC 2658)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1158,7 +1221,7 @@
<element>
<name>rtpqdm2depay</name>
<longname>RTP QDM2 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts QDM2 audio from RTP packets (no RFC)</description>
<author>Edward Hervey &lt;bilboed@bilboed.com&gt;</author>
<pads>
@ -1179,7 +1242,7 @@
<element>
<name>rtpsirendepay</name>
<longname>RTP Siren packet depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts Siren audio from RTP packets</description>
<author>Philippe Kalaf &lt;philippe.kalaf@collabora.co.uk&gt;</author>
<pads>
@ -1200,7 +1263,7 @@
<element>
<name>rtpsirenpay</name>
<longname>RTP Payloader for Siren Audio</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Packetize Siren audio streams into RTP packets</description>
<author>Youness Alaoui &lt;kakaroto@kakaroto.homelinux.net&gt;</author>
<pads>
@ -1221,7 +1284,7 @@
<element>
<name>rtpspeexdepay</name>
<longname>RTP Speex depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts Speex audio from RTP packets</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads>
@ -1242,7 +1305,7 @@
<element>
<name>rtpspeexpay</name>
<longname>RTP Speex payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encodes Speex audio into a RTP packet</description>
<author>Edgard Lima &lt;edgard.lima@indt.org.br&gt;</author>
<pads>
@ -1263,7 +1326,7 @@
<element>
<name>rtpsv3vdepay</name>
<longname>RTP SVQ3 depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts SVQ3 video from RTP packets (no RFC)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1284,7 +1347,7 @@
<element>
<name>rtptheoradepay</name>
<longname>RTP Theora depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts Theora video from RTP packets (draft-01 of RFC XXXX)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1305,7 +1368,7 @@
<element>
<name>rtptheorapay</name>
<longname>RTP Theora payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1326,7 +1389,7 @@
<element>
<name>rtpvorbisdepay</name>
<longname>RTP Vorbis depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts Vorbis Audio from RTP packets (RFC 5215)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1347,7 +1410,7 @@
<element>
<name>rtpvorbispay</name>
<longname>RTP Vorbis depayloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload-encode Vorbis audio into RTP packets (RFC 5215)</description>
<author>Wim Taymans &lt;wimi.taymans@gmail.com&gt;</author>
<pads>
@ -1368,7 +1431,7 @@
<element>
<name>rtpvrawdepay</name>
<longname>RTP Raw Video depayloader</longname>
<class>Codec/Depayloader/Network</class>
<class>Codec/Depayloader/Network/RTP</class>
<description>Extracts raw video from RTP packets (RFC 4175)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>
@ -1389,7 +1452,7 @@
<element>
<name>rtpvrawpay</name>
<longname>RTP Raw Video payloader</longname>
<class>Codec/Payloader/Network</class>
<class>Codec/Payloader/Network/RTP</class>
<description>Payload raw video as RTP packets (RFC 4175)</description>
<author>Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
<pads>

View file

@ -3,7 +3,7 @@
<description>transfer data via RTSP</description>
<filename>../../gst/rtsp/.libs/libgstrtsp.so</filename>
<basename>libgstrtsp.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Shape Wipe transition filter</description>
<filename>../../gst/shapewipe/.libs/libgstshapewipe.so</filename>
<basename>libgstshapewipe.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Sends data to an icecast server using libshout2</description>
<filename>../../ext/shout2/.libs/libgstshout2.so</filename>
<basename>libgstshout2.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>libshout2</package>

View file

@ -3,7 +3,7 @@
<description>Apply the standard SMPTE transitions on video images</description>
<filename>../../gst/smpte/.libs/libgstsmpte.so</filename>
<basename>libgstsmpte.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>libsoup HTTP client src</description>
<filename>../../ext/soup/.libs/libgstsouphttpsrc.so</filename>
<basename>libgstsouphttpsrc.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Run an FFT on the audio signal, output spectrum data</description>
<filename>../../gst/spectrum/.libs/libgstspectrum.so</filename>
<basename>libgstspectrum.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Speex plugin library</description>
<filename>../../ext/speex/.libs/libgstspeex.so</filename>
<basename>libgstspeex.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Tag writing plug-in based on taglib</description>
<filename>../../ext/taglib/.libs/libgsttaglib.so</filename>
<basename>libgsttaglib.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>transfer data via UDP</description>
<filename>../../gst/udp/.libs/libgstudp.so</filename>
<basename>libgstudp.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>elements for Video 4 Linux</description>
<filename>../../sys/v4l2/.libs/libgstvideo4linux2.so</filename>
<basename>libgstvideo4linux2.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>resizes a video by adding borders or cropping</description>
<filename>../../gst/videobox/.libs/libgstvideobox.so</filename>
<basename>libgstvideobox.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Crops video into a user-defined region</description>
<filename>../../gst/videocrop/.libs/libgstvideocrop.so</filename>
<basename>libgstvideocrop.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Video filters plugin</description>
<filename>../../gst/videofilter/.libs/libgstvideofilter.so</filename>
<basename>libgstvideofilter.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Video mixer</description>
<filename>../../gst/videomixer/.libs/libgstvideomixer.so</filename>
<basename>libgstvideomixer.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Encode raw audio into WAV</description>
<filename>../../gst/wavenc/.libs/libgstwavenc.so</filename>
<basename>libgstwavenc.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Wavpack lossless/lossy audio format handling</description>
<filename>../../ext/wavpack/.libs/libgstwavpack.so</filename>
<basename>libgstwavpack.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Parse a .wav file into raw audio</description>
<filename>../../gst/wavparse/.libs/libgstwavparse.so</filename>
<basename>libgstwavparse.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>X11 video input plugin using standard Xlib calls</description>
<filename>../../sys/ximage/.libs/libgstximagesrc.so</filename>
<basename>libgstximagesrc.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -3,7 +3,7 @@
<description>Encodes a YUV frame into the yuv4mpeg format (mjpegtools)</description>
<filename>../../gst/y4m/.libs/libgsty4menc.so</filename>
<basename>libgsty4menc.so</basename>
<version>0.10.26.1</version>
<version>0.10.27.1</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins git</package>

View file

@ -46,6 +46,12 @@ else
HAL_DIR =
endif
if USE_JACK
JACK_DIR=jack
else
JACK_DIR=
endif
if USE_JPEG
JPEG_DIR = jpeg
else
@ -135,6 +141,7 @@ SUBDIRS = \
$(GCONF_DIR) \
$(GDK_PIXBUF_DIR) \
$(HAL_DIR) \
$(JACK_DIR) \
$(JPEG_DIR) \
$(LIBCACA_DIR) \
$(LIBDV_DIR) \
@ -158,6 +165,7 @@ DIST_SUBDIRS = \
gconf \
gdk_pixbuf \
hal \
jack \
jpeg \
libcaca \
libpng \

View file

@ -264,52 +264,63 @@ gst_cairo_render_setcaps_sink (GstPad * pad, GstCaps * caps)
return TRUE;
}
static GstStaticPadTemplate t_src = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (
#define SIZE_CAPS "width = (int) [ 1, MAX], height = (int) [ 1, MAX] "
#if CAIRO_HAS_PDF_SURFACE
"application/pdf, "
"width = (int) [ 1, MAX], " "height = (int) [ 1, MAX] "
#define PDF_CAPS "application/pdf, " SIZE_CAPS
#else
#define PDF_CAPS
#endif
#if CAIRO_HAS_PDF_SURFACE && (CAIRO_HAS_PS_SURFACE || CAIRO_HAS_SVG_SURFACE || CAIRO_HAS_PNG_FUNCTIONS)
";"
#define JOIN1 ";"
#else
#define JOIN1
#endif
#if CAIRO_HAS_PS_SURFACE
"application/postscript, "
"width = (int) [ 1, MAX], " "height = (int) [ 1, MAX] "
#define PS_CAPS "application/postscript, " SIZE_CAPS
#else
#define PS_CAPS
#endif
#if (CAIRO_HAS_PDF_SURFACE || CAIRO_HAS_PS_SURFACE) && (CAIRO_HAS_SVG_SURFACE || CAIRO_HAS_PNG_FUNCTIONS)
";"
#define JOIN2 ";"
#else
#define JOIN2
#endif
#if CAIRO_HAS_SVG_SURFACE
"image/svg+xml, "
"width = (int) [ 1, MAX], " "height = (int) [ 1, MAX] "
#define SVG_CAPS "image/svg+xml, " SIZE_CAPS
#else
#define SVG_CAPS
#endif
#if (CAIRO_HAS_PDF_SURFACE || CAIRO_HAS_PS_SURFACE || CAIRO_HAS_SVG_SURFACE) && CAIRO_HAS_PNG_FUNCTIONS
";"
#define JOIN3 ";"
#else
#define JOIN3
#endif
#if CAIRO_HAS_PNG_FUNCTIONS
"image/png, " "width = (int) [ 1, MAX], " "height = (int) [ 1, MAX] "
#endif
));
static GstStaticPadTemplate t_snk = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
GST_VIDEO_CAPS_BGRx " ; " GST_VIDEO_CAPS_BGRA " ; "
#define PNG_CAPS "image/png, " SIZE_CAPS
#define PNG_CAPS2 "; image/png, " SIZE_CAPS
#else
GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_ARGB " ; "
#define PNG_CAPS
#define PNG_CAPS2
#endif
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define ARGB_CAPS GST_VIDEO_CAPS_BGRx " ; " GST_VIDEO_CAPS_BGRA " ; "
#else
#define ARGB_CAPS GST_VIDEO_CAPS_xRGB " ; " GST_VIDEO_CAPS_ARGB " ; "
#endif
static GstStaticPadTemplate t_src = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_ALWAYS,
GST_STATIC_CAPS (PDF_CAPS JOIN1 PS_CAPS JOIN2 SVG_CAPS JOIN3 PNG_CAPS));
static GstStaticPadTemplate t_snk = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (ARGB_CAPS
GST_VIDEO_CAPS_YUV ("Y800") " ; "
"video/x-raw-gray, "
"bpp = 8, "
"depth = 8, "
"width = " GST_VIDEO_SIZE_RANGE ", "
"height = " GST_VIDEO_SIZE_RANGE ", " "framerate = " GST_VIDEO_FPS_RANGE
" ; "
#if CAIRO_HAS_PNG_FUNCTIONS
"image/png, "
"width = " GST_VIDEO_SIZE_RANGE ", " "height = " GST_VIDEO_SIZE_RANGE
#endif
));
PNG_CAPS2));
GST_BOILERPLATE (GstCairoRender, gst_cairo_render, GstElement,
GST_TYPE_ELEMENT);

View file

@ -36,19 +36,16 @@
#include "config.h"
#endif
#include <gst/math-compat.h>
#include <gsttimeoverlay.h>
#include <string.h>
#include <math.h>
#include <cairo.h>
#include <gst/video/video.h>
#ifndef HAVE_RINT
#define rint(x) ((double) floor((x)+(((x) < 0)? -0.5 : 0.5)))
#endif
static GstStaticPadTemplate gst_cairo_time_overlay_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,

View file

@ -895,17 +895,13 @@ gst_dvdemux_convert_segment (GstDVDemux * dvdemux, GstSegment * src,
*
* Convert the time seek to a bytes seek and send it
* upstream
*
* FIXME, upstream might be able to perform time based
* seek too.
*
* Does not take ownership of the event.
*/
static gboolean
gst_dvdemux_handle_push_seek (GstDVDemux * dvdemux, GstPad * pad,
GstEvent * event)
{
gboolean res;
gboolean res = FALSE;
gdouble rate;
GstSeekFlags flags;
GstFormat format;
@ -917,19 +913,24 @@ gst_dvdemux_handle_push_seek (GstDVDemux * dvdemux, GstPad * pad,
gst_event_parse_seek (event, &rate, &format, &flags,
&cur_type, &cur, &stop_type, &stop);
/* we convert the start/stop on the srcpad to the byte format
* on the sinkpad and forward the event */
res = gst_dvdemux_convert_src_to_sink (dvdemux, pad,
format, cur, stop, GST_FORMAT_BYTES, &start_position, &end_position);
if (!res)
goto done;
/* First try if upstream can handle time based seeks */
if (format == GST_FORMAT_TIME)
res = gst_pad_push_event (dvdemux->sinkpad, event);
/* now this is the updated seek event on bytes */
newevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
cur_type, start_position, stop_type, end_position);
if (!res) {
/* we convert the start/stop on the srcpad to the byte format
* on the sinkpad and forward the event */
res = gst_dvdemux_convert_src_to_sink (dvdemux, pad,
format, cur, stop, GST_FORMAT_BYTES, &start_position, &end_position);
if (!res)
goto done;
res = gst_pad_push_event (dvdemux->sinkpad, newevent);
/* now this is the updated seek event on bytes */
newevent = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
cur_type, start_position, stop_type, end_position);
res = gst_pad_push_event (dvdemux->sinkpad, newevent);
}
done:
return res;
}

1
ext/jack/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.loT

10
ext/jack/Makefile.am Normal file
View file

@ -0,0 +1,10 @@
plugin_LTLIBRARIES = libgstjack.la
libgstjack_la_SOURCES = gstjackutil.c gstjack.c gstjackaudiosrc.c gstjackaudiosink.c gstjackaudioclient.c
libgstjack_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(JACK_CFLAGS)
libgstjack_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(JACK_LIBS)
libgstjack_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstjack_la_LIBTOOLFLAGS = --tag=disable-static
noinst_HEADERS = gstjackutil.h gstjackaudiosrc.h gstjackaudiosink.h gstjackaudioclient.h gstjack.h gstjackringbuffer.h

97
ext/jack/gstjack.c Normal file
View file

@ -0,0 +1,97 @@
/* GStreamer Jack plugins
* Copyright (C) 2006 Wim Taymans <wim@fluendo.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 "gstjackaudiosrc.h"
#include "gstjackaudiosink.h"
GType
gst_jack_connect_get_type (void)
{
static volatile gsize jack_connect_type = 0;
if (g_once_init_enter (&jack_connect_type)) {
static const GEnumValue jack_connect_enums[] = {
{GST_JACK_CONNECT_NONE,
"Don't automatically connect ports to physical ports", "none"},
{GST_JACK_CONNECT_AUTO,
"Automatically connect ports to physical ports", "auto"},
{GST_JACK_CONNECT_AUTO_FORCED,
"Automatically connect ports to as many physical ports as possible",
"auto-forced"},
{0, NULL, NULL},
};
GType tmp = g_enum_register_static ("GstJackConnect", jack_connect_enums);
g_once_init_leave (&jack_connect_type, tmp);
}
return (GType) jack_connect_type;
}
static gpointer
gst_jack_client_copy (gpointer jclient)
{
return jclient;
}
static void
gst_jack_client_free (gpointer jclient)
{
return;
}
GType
gst_jack_client_get_type (void)
{
static volatile gsize jack_client_type = 0;
if (g_once_init_enter (&jack_client_type)) {
/* hackish, but makes it show up nicely in gst-inspect */
GType tmp = g_boxed_type_register_static ("JackClient",
(GBoxedCopyFunc) gst_jack_client_copy,
(GBoxedFreeFunc) gst_jack_client_free);
g_once_init_leave (&jack_client_type, tmp);
}
return (GType) jack_client_type;
}
static gboolean
plugin_init (GstPlugin * plugin)
{
if (!gst_element_register (plugin, "jackaudiosrc", GST_RANK_PRIMARY,
GST_TYPE_JACK_AUDIO_SRC))
return FALSE;
if (!gst_element_register (plugin, "jackaudiosink", GST_RANK_PRIMARY,
GST_TYPE_JACK_AUDIO_SINK))
return FALSE;
return TRUE;
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"jack",
"JACK audio elements",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)

55
ext/jack/gstjack.h Normal file
View file

@ -0,0 +1,55 @@
/* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
*
* gstjack.h:
*
* 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_JACK_H_
#define _GST_JACK_H_
/**
* GstJackConnect:
* @GST_JACK_CONNECT_NONE: Don't automatically connect to physical ports.
* In this mode, the element will accept any number of input channels and will
* create (but not connect) an output port for each channel.
* @GST_JACK_CONNECT_AUTO: In this mode, the element will try to connect each
* output port to a random physical jack input pin. The sink will
* expose the number of physical channels on its pad caps.
* @GST_JACK_CONNECT_AUTO_FORCED: In this mode, the element will try to connect each
* output port to a random physical jack input pin. The element will accept any number
* of input channels.
*
* Specify how the output ports will be connected.
*/
typedef enum {
GST_JACK_CONNECT_NONE,
GST_JACK_CONNECT_AUTO,
GST_JACK_CONNECT_AUTO_FORCED
} GstJackConnect;
typedef jack_default_audio_sample_t sample_t;
#define GST_TYPE_JACK_CONNECT (gst_jack_connect_get_type())
#define GST_TYPE_JACK_CLIENT (gst_jack_client_get_type ())
GType gst_jack_client_get_type(void);
GType gst_jack_connect_get_type(void);
#endif // _GST_JACK_H_

View file

@ -0,0 +1,525 @@
/* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
*
* gstjackaudioclient.c: jack audio client implementation
*
* 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.
*/
#include <string.h>
#include "gstjackaudioclient.h"
GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_client_debug);
#define GST_CAT_DEFAULT gst_jack_audio_client_debug
void
gst_jack_audio_client_init (void)
{
GST_DEBUG_CATEGORY_INIT (gst_jack_audio_client_debug, "jackclient", 0,
"jackclient helpers");
}
/* a list of global connections indexed by id and server. */
G_LOCK_DEFINE_STATIC (connections_lock);
static GList *connections;
/* the connection to a server */
typedef struct
{
gint refcount;
GMutex *lock;
GCond *flush_cond;
/* id/server pair and the connection */
gchar *id;
gchar *server;
jack_client_t *client;
/* lists of GstJackAudioClients */
gint n_clients;
GList *src_clients;
GList *sink_clients;
} GstJackAudioConnection;
/* an object sharing a jack_client_t connection. */
struct _GstJackAudioClient
{
GstJackAudioConnection *conn;
GstJackClientType type;
gboolean active;
gboolean deactivate;
void (*shutdown) (void *arg);
JackProcessCallback process;
JackBufferSizeCallback buffer_size;
JackSampleRateCallback sample_rate;
gpointer user_data;
};
typedef jack_default_audio_sample_t sample_t;
typedef struct
{
jack_nframes_t nframes;
gpointer user_data;
} JackCB;
static int
jack_process_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioConnection *conn = (GstJackAudioConnection *) arg;
GList *walk;
int res = 0;
g_mutex_lock (conn->lock);
/* call sources first, then sinks. Sources will either push data into the
* ringbuffer of the sinks, which will then pull the data out of it, or
* sinks will pull the data from the sources. */
for (walk = conn->src_clients; walk; walk = g_list_next (walk)) {
GstJackAudioClient *client = (GstJackAudioClient *) walk->data;
/* only call active clients */
if ((client->active || client->deactivate) && client->process) {
res = client->process (nframes, client->user_data);
if (client->deactivate) {
client->deactivate = FALSE;
g_cond_signal (conn->flush_cond);
}
}
}
for (walk = conn->sink_clients; walk; walk = g_list_next (walk)) {
GstJackAudioClient *client = (GstJackAudioClient *) walk->data;
/* only call active clients */
if ((client->active || client->deactivate) && client->process) {
res = client->process (nframes, client->user_data);
if (client->deactivate) {
client->deactivate = FALSE;
g_cond_signal (conn->flush_cond);
}
}
}
g_mutex_unlock (conn->lock);
return res;
}
/* we error out */
static int
jack_sample_rate_cb (jack_nframes_t nframes, void *arg)
{
return 0;
}
/* we error out */
static int
jack_buffer_size_cb (jack_nframes_t nframes, void *arg)
{
return 0;
}
static void
jack_shutdown_cb (void *arg)
{
GstJackAudioConnection *conn = (GstJackAudioConnection *) arg;
GList *walk;
GST_DEBUG ("disconnect client %s from server %s", conn->id,
GST_STR_NULL (conn->server));
g_mutex_lock (conn->lock);
for (walk = conn->src_clients; walk; walk = g_list_next (walk)) {
GstJackAudioClient *client = (GstJackAudioClient *) walk->data;
if (client->shutdown)
client->shutdown (client->user_data);
}
for (walk = conn->sink_clients; walk; walk = g_list_next (walk)) {
GstJackAudioClient *client = (GstJackAudioClient *) walk->data;
if (client->shutdown)
client->shutdown (client->user_data);
}
g_mutex_unlock (conn->lock);
}
typedef struct
{
const gchar *id;
const gchar *server;
} FindData;
static gint
connection_find (GstJackAudioConnection * conn, FindData * data)
{
/* id's must match */
if (strcmp (conn->id, data->id))
return 1;
/* both the same or NULL */
if (conn->server == data->server)
return 0;
/* we cannot compare NULL */
if (conn->server == NULL || data->server == NULL)
return 1;
if (strcmp (conn->server, data->server))
return 1;
return 0;
}
/* make a connection with @id and @server. Returns NULL on failure with the
* status set. */
static GstJackAudioConnection *
gst_jack_audio_make_connection (const gchar * id, const gchar * server,
jack_client_t * jclient, jack_status_t * status)
{
GstJackAudioConnection *conn;
jack_options_t options;
gint res;
*status = 0;
GST_DEBUG ("new client %s, connecting to server %s", id,
GST_STR_NULL (server));
/* never start a server */
options = JackNoStartServer;
/* if we have a servername, use it */
if (server != NULL)
options |= JackServerName;
/* open the client */
if (jclient == NULL)
jclient = jack_client_open (id, options, status, server);
if (jclient == NULL)
goto could_not_open;
/* now create object */
conn = g_new (GstJackAudioConnection, 1);
conn->refcount = 1;
conn->lock = g_mutex_new ();
conn->flush_cond = g_cond_new ();
conn->id = g_strdup (id);
conn->server = g_strdup (server);
conn->client = jclient;
conn->n_clients = 0;
conn->src_clients = NULL;
conn->sink_clients = NULL;
/* set our callbacks */
jack_set_process_callback (jclient, jack_process_cb, conn);
/* these callbacks cause us to error */
jack_set_buffer_size_callback (jclient, jack_buffer_size_cb, conn);
jack_set_sample_rate_callback (jclient, jack_sample_rate_cb, conn);
jack_on_shutdown (jclient, jack_shutdown_cb, conn);
/* all callbacks are set, activate the client */
if ((res = jack_activate (jclient)))
goto could_not_activate;
GST_DEBUG ("opened connection %p", conn);
return conn;
/* ERRORS */
could_not_open:
{
GST_DEBUG ("failed to open jack client, %d", *status);
return NULL;
}
could_not_activate:
{
GST_ERROR ("Could not activate client (%d)", res);
*status = JackFailure;
g_mutex_free (conn->lock);
g_free (conn->id);
g_free (conn->server);
g_free (conn);
return NULL;
}
}
static GstJackAudioConnection *
gst_jack_audio_get_connection (const gchar * id, const gchar * server,
jack_client_t * jclient, jack_status_t * status)
{
GstJackAudioConnection *conn;
GList *found;
FindData data;
GST_DEBUG ("getting connection for id %s, server %s", id,
GST_STR_NULL (server));
data.id = id;
data.server = server;
G_LOCK (connections_lock);
found =
g_list_find_custom (connections, &data, (GCompareFunc) connection_find);
if (found != NULL && jclient != NULL) {
/* we found it, increase refcount and return it */
conn = (GstJackAudioConnection *) found->data;
conn->refcount++;
GST_DEBUG ("found connection %p", conn);
} else {
/* make new connection */
conn = gst_jack_audio_make_connection (id, server, jclient, status);
if (conn != NULL) {
GST_DEBUG ("created connection %p", conn);
/* add to list on success */
connections = g_list_prepend (connections, conn);
} else {
GST_WARNING ("could not create connection");
}
}
G_UNLOCK (connections_lock);
return conn;
}
static void
gst_jack_audio_unref_connection (GstJackAudioConnection * conn)
{
gint res;
gboolean zero;
GST_DEBUG ("unref connection %p refcnt %d", conn, conn->refcount);
G_LOCK (connections_lock);
conn->refcount--;
if ((zero = (conn->refcount == 0))) {
GST_DEBUG ("closing connection %p", conn);
/* remove from list, we can release the mutex after removing the connection
* from the list because after that, nobody can access the connection anymore. */
connections = g_list_remove (connections, conn);
}
G_UNLOCK (connections_lock);
/* if we are zero, close and cleanup the connection */
if (zero) {
/* don't use conn->lock here. two reasons:
*
* 1) its not necessary: jack_deactivate() will not return until the JACK thread
* associated with this connection is cleaned up by a thread join, hence
* no more callbacks can occur or be in progress.
*
* 2) it would deadlock anyway, because jack_deactivate() will sleep
* waiting for the JACK thread, and can thus cause deadlock in
* jack_process_cb()
*/
if ((res = jack_deactivate (conn->client))) {
/* we only warn, this means the server is probably shut down and the client
* is gone anyway. */
GST_WARNING ("Could not deactivate Jack client (%d)", res);
}
/* close connection */
if ((res = jack_client_close (conn->client))) {
/* we assume the client is gone. */
GST_WARNING ("close failed (%d)", res);
}
/* free resources */
g_mutex_free (conn->lock);
g_cond_free (conn->flush_cond);
g_free (conn->id);
g_free (conn->server);
g_free (conn);
}
}
static void
gst_jack_audio_connection_add_client (GstJackAudioConnection * conn,
GstJackAudioClient * client)
{
g_mutex_lock (conn->lock);
switch (client->type) {
case GST_JACK_CLIENT_SOURCE:
conn->src_clients = g_list_append (conn->src_clients, client);
conn->n_clients++;
break;
case GST_JACK_CLIENT_SINK:
conn->sink_clients = g_list_append (conn->sink_clients, client);
conn->n_clients++;
break;
default:
g_warning ("trying to add unknown client type");
break;
}
g_mutex_unlock (conn->lock);
}
static void
gst_jack_audio_connection_remove_client (GstJackAudioConnection * conn,
GstJackAudioClient * client)
{
g_mutex_lock (conn->lock);
switch (client->type) {
case GST_JACK_CLIENT_SOURCE:
conn->src_clients = g_list_remove (conn->src_clients, client);
conn->n_clients--;
break;
case GST_JACK_CLIENT_SINK:
conn->sink_clients = g_list_remove (conn->sink_clients, client);
conn->n_clients--;
break;
default:
g_warning ("trying to remove unknown client type");
break;
}
g_mutex_unlock (conn->lock);
}
/**
* gst_jack_audio_client_get:
* @id: the client id
* @server: the server to connect to or NULL for the default server
* @type: the client type
* @shutdown: a callback when the jack server shuts down
* @process: a callback when samples are available
* @buffer_size: a callback when the buffer_size changes
* @sample_rate: a callback when the sample_rate changes
* @user_data: user data passed to the callbacks
* @status: pointer to hold the jack status code in case of errors
*
* Get the jack client connection for @id and @server. Connections to the same
* @id and @server will receive the same physical Jack client connection and
* will therefore be scheduled in the same process callback.
*
* Returns: a #GstJackAudioClient.
*/
GstJackAudioClient *
gst_jack_audio_client_new (const gchar * id, const gchar * server,
jack_client_t * jclient, GstJackClientType type,
void (*shutdown) (void *arg), JackProcessCallback process,
JackBufferSizeCallback buffer_size, JackSampleRateCallback sample_rate,
gpointer user_data, jack_status_t * status)
{
GstJackAudioClient *client;
GstJackAudioConnection *conn;
g_return_val_if_fail (id != NULL, NULL);
g_return_val_if_fail (status != NULL, NULL);
/* first get a connection for the id/server pair */
conn = gst_jack_audio_get_connection (id, server, jclient, status);
if (conn == NULL)
goto no_connection;
GST_INFO ("new client %s", id);
/* make new client using the connection */
client = g_new (GstJackAudioClient, 1);
client->active = client->deactivate = FALSE;
client->conn = conn;
client->type = type;
client->shutdown = shutdown;
client->process = process;
client->buffer_size = buffer_size;
client->sample_rate = sample_rate;
client->user_data = user_data;
/* add the client to the connection */
gst_jack_audio_connection_add_client (conn, client);
return client;
/* ERRORS */
no_connection:
{
GST_DEBUG ("Could not get server connection (%d)", *status);
return NULL;
}
}
/**
* gst_jack_audio_client_free:
* @client: a #GstJackAudioClient
*
* Free the resources used by @client.
*/
void
gst_jack_audio_client_free (GstJackAudioClient * client)
{
GstJackAudioConnection *conn;
g_return_if_fail (client != NULL);
GST_INFO ("free client");
conn = client->conn;
/* remove from connection first so that it's not scheduled anymore after this
* call */
gst_jack_audio_connection_remove_client (conn, client);
gst_jack_audio_unref_connection (conn);
g_free (client);
}
/**
* gst_jack_audio_client_get_client:
* @client: a #GstJackAudioClient
*
* Get the jack audio client for @client. This function is used to perform
* operations on the jack server from this client.
*
* Returns: The jack audio client.
*/
jack_client_t *
gst_jack_audio_client_get_client (GstJackAudioClient * client)
{
g_return_val_if_fail (client != NULL, NULL);
/* no lock needed, the connection and the client does not change
* once the client is created. */
return client->conn->client;
}
/**
* gst_jack_audio_client_set_active:
* @client: a #GstJackAudioClient
* @active: new mode for the client
*
* Activate or deactive @client. When a client is activated it will receive
* callbacks when data should be processed.
*
* Returns: 0 if all ok.
*/
gint
gst_jack_audio_client_set_active (GstJackAudioClient * client, gboolean active)
{
g_return_val_if_fail (client != NULL, -1);
/* make sure that we are not dispatching the client */
g_mutex_lock (client->conn->lock);
if (client->active && !active) {
/* we need to process once more to flush the port */
client->deactivate = TRUE;
/* need to wait for process_cb run once more */
while (client->deactivate)
g_cond_wait (client->conn->flush_cond, client->conn->lock);
}
client->active = active;
g_mutex_unlock (client->conn->lock);
return 0;
}

View file

@ -0,0 +1,59 @@
/* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
*
* gstjackaudioclient.h:
*
* 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_JACK_AUDIO_CLIENT_H__
#define __GST_JACK_AUDIO_CLIENT_H__
#include <jack/jack.h>
#include <gst/gst.h>
G_BEGIN_DECLS
typedef enum
{
GST_JACK_CLIENT_SOURCE,
GST_JACK_CLIENT_SINK
} GstJackClientType;
typedef struct _GstJackAudioClient GstJackAudioClient;
void gst_jack_audio_client_init (void);
GstJackAudioClient * gst_jack_audio_client_new (const gchar *id, const gchar *server,
jack_client_t *jclient,
GstJackClientType type,
void (*shutdown) (void *arg),
JackProcessCallback process,
JackBufferSizeCallback buffer_size,
JackSampleRateCallback sample_rate,
gpointer user_data,
jack_status_t *status);
void gst_jack_audio_client_free (GstJackAudioClient *client);
jack_client_t * gst_jack_audio_client_get_client (GstJackAudioClient *client);
gboolean gst_jack_audio_client_set_active (GstJackAudioClient *client, gboolean active);
G_END_DECLS
#endif /* __GST_JACK_AUDIO_CLIENT_H__ */

853
ext/jack/gstjackaudiosink.c Normal file
View file

@ -0,0 +1,853 @@
/* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
*
* gstjackaudiosink.c: jack audio sink implementation
*
* 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-jackaudiosink
* @see_also: #GstBaseAudioSink, #GstRingBuffer
*
* A Sink that outputs data to Jack ports.
*
* It will create N Jack ports named out_&lt;name&gt;_&lt;num&gt; where
* &lt;name&gt; is the element name and &lt;num&gt; is starting from 1.
* Each port corresponds to a gstreamer channel.
*
* The samplerate as exposed on the caps is always the same as the samplerate of
* the jack server.
*
* When the #GstJackAudioSink:connect property is set to auto, this element
* will try to connect each output port to a random physical jack input pin. In
* this mode, the sink will expose the number of physical channels on its pad
* caps.
*
* When the #GstJackAudioSink:connect property is set to none, the element will
* accept any number of input channels and will create (but not connect) an
* output port for each channel.
*
* The element will generate an error when the Jack server is shut down when it
* was PAUSED or PLAYING. This element does not support dynamic rate and buffer
* size changes at runtime.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch audiotestsrc ! jackaudiosink
* ]| Play a sine wave to using jack.
* </refsect2>
*
* Last reviewed on 2006-11-30 (0.10.4)
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst-i18n-plugin.h>
#include <stdlib.h>
#include <string.h>
#include "gstjackaudiosink.h"
#include "gstjackringbuffer.h"
GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_sink_debug);
#define GST_CAT_DEFAULT gst_jack_audio_sink_debug
static gboolean
gst_jack_audio_sink_allocate_channels (GstJackAudioSink * sink, gint channels)
{
jack_client_t *client;
client = gst_jack_audio_client_get_client (sink->client);
/* remove ports we don't need */
while (sink->port_count > channels) {
jack_port_unregister (client, sink->ports[--sink->port_count]);
}
/* alloc enough output ports */
sink->ports = g_realloc (sink->ports, sizeof (jack_port_t *) * channels);
/* create an output port for each channel */
while (sink->port_count < channels) {
gchar *name;
/* port names start from 1 and are local to the element */
name =
g_strdup_printf ("out_%s_%d", GST_ELEMENT_NAME (sink),
sink->port_count + 1);
sink->ports[sink->port_count] =
jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE,
JackPortIsOutput, 0);
if (sink->ports[sink->port_count] == NULL)
return FALSE;
sink->port_count++;
g_free (name);
}
return TRUE;
}
static void
gst_jack_audio_sink_free_channels (GstJackAudioSink * sink)
{
gint res, i = 0;
jack_client_t *client;
client = gst_jack_audio_client_get_client (sink->client);
/* get rid of all ports */
while (sink->port_count) {
GST_LOG_OBJECT (sink, "unregister port %d", i);
if ((res = jack_port_unregister (client, sink->ports[i++]))) {
GST_DEBUG_OBJECT (sink, "unregister of port failed (%d)", res);
}
sink->port_count--;
}
g_free (sink->ports);
sink->ports = NULL;
}
/* ringbuffer abstract base class */
static GType
gst_jack_ring_buffer_get_type (void)
{
static volatile gsize ringbuffer_type = 0;
if (g_once_init_enter (&ringbuffer_type)) {
static const GTypeInfo ringbuffer_info = {
sizeof (GstJackRingBufferClass),
NULL,
NULL,
(GClassInitFunc) gst_jack_ring_buffer_class_init,
NULL,
NULL,
sizeof (GstJackRingBuffer),
0,
(GInstanceInitFunc) gst_jack_ring_buffer_init,
NULL
};
GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER,
"GstJackAudioSinkRingBuffer", &ringbuffer_info, 0);
g_once_init_leave (&ringbuffer_type, tmp);
}
return (GType) ringbuffer_type;
}
static void
gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass)
{
GObjectClass *gobject_class;
GstObjectClass *gstobject_class;
GstRingBufferClass *gstringbuffer_class;
gobject_class = (GObjectClass *) klass;
gstobject_class = (GstObjectClass *) klass;
gstringbuffer_class = (GstRingBufferClass *) klass;
ring_parent_class = g_type_class_peek_parent (klass);
gstringbuffer_class->open_device =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device);
gstringbuffer_class->close_device =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device);
gstringbuffer_class->acquire =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire);
gstringbuffer_class->release =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release);
gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause);
gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop);
gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay);
}
/* this is the callback of jack. This should RT-safe.
*/
static int
jack_process_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSink *sink;
GstRingBuffer *buf;
GstJackRingBuffer *abuf;
gint readseg, len;
guint8 *readptr;
gint i, j, flen, channels;
sample_t **buffers, *data;
buf = GST_RING_BUFFER_CAST (arg);
abuf = GST_JACK_RING_BUFFER_CAST (arg);
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
channels = buf->spec.channels;
/* alloc pointers to samples */
buffers = g_alloca (sizeof (sample_t *) * channels);
/* get target buffers */
for (i = 0; i < channels; i++) {
buffers[i] = (sample_t *) jack_port_get_buffer (sink->ports[i], nframes);
}
if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
flen = len / channels;
/* the number of samples must be exactly the segment size */
if (nframes * sizeof (sample_t) != flen)
goto wrong_size;
GST_DEBUG_OBJECT (sink, "copy %d frames: %p, %d bytes, %d channels",
nframes, readptr, flen, channels);
data = (sample_t *) readptr;
/* the samples in the ringbuffer have the channels interleaved, we need to
* deinterleave into the jack target buffers */
for (i = 0; i < nframes; i++) {
for (j = 0; j < channels; j++) {
buffers[j][i] = *data++;
}
}
/* clear written samples in the ringbuffer */
gst_ring_buffer_clear (buf, readseg);
/* we wrote one segment */
gst_ring_buffer_advance (buf, 1);
} else {
GST_DEBUG_OBJECT (sink, "write %d frames silence", nframes);
/* We are not allowed to read from the ringbuffer, write silence to all
* jack output buffers */
for (i = 0; i < channels; i++) {
memset (buffers[i], 0, nframes * sizeof (sample_t));
}
}
return 0;
/* ERRORS */
wrong_size:
{
GST_ERROR_OBJECT (sink, "nbytes (%d) != flen (%d)",
(gint) (nframes * sizeof (sample_t)), flen);
return 1;
}
}
/* we error out */
static int
jack_sample_rate_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSink *sink;
GstJackRingBuffer *abuf;
abuf = GST_JACK_RING_BUFFER_CAST (arg);
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
if (abuf->sample_rate != -1 && abuf->sample_rate != nframes)
goto not_supported;
return 0;
/* ERRORS */
not_supported:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
(NULL), ("Jack changed the sample rate, which is not supported"));
return 1;
}
}
/* we error out */
static int
jack_buffer_size_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSink *sink;
GstJackRingBuffer *abuf;
abuf = GST_JACK_RING_BUFFER_CAST (arg);
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
if (abuf->buffer_size != -1 && abuf->buffer_size != nframes)
goto not_supported;
return 0;
/* ERRORS */
not_supported:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
(NULL), ("Jack changed the buffer size, which is not supported"));
return 1;
}
}
static void
jack_shutdown_cb (void *arg)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
GST_DEBUG_OBJECT (sink, "shutdown");
GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
(NULL), ("Jack server shutdown"));
}
static void
gst_jack_ring_buffer_init (GstJackRingBuffer * buf,
GstJackRingBufferClass * g_class)
{
buf->channels = -1;
buf->buffer_size = -1;
buf->sample_rate = -1;
}
/* the _open_device method should make a connection with the server
*/
static gboolean
gst_jack_ring_buffer_open_device (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
jack_status_t status = 0;
const gchar *name;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "open");
name = g_get_application_name ();
if (!name)
name = "GStreamer";
sink->client = gst_jack_audio_client_new (name, sink->server,
sink->jclient,
GST_JACK_CLIENT_SINK,
jack_shutdown_cb,
jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
if (sink->client == NULL)
goto could_not_open;
GST_DEBUG_OBJECT (sink, "opened");
return TRUE;
/* ERRORS */
could_not_open:
{
if (status & JackServerFailed) {
GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
(_("Jack server not found")),
("Cannot connect to the Jack server (status %d)", status));
} else {
GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE,
(NULL), ("Jack client open error (status %d)", status));
}
return FALSE;
}
}
/* close the connection with the server
*/
static gboolean
gst_jack_ring_buffer_close_device (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "close");
gst_jack_audio_sink_free_channels (sink);
gst_jack_audio_client_free (sink->client);
sink->client = NULL;
return TRUE;
}
/* allocate a buffer and setup resources to process the audio samples of
* the format as specified in @spec.
*
* We allocate N jack ports, one for each channel. If we are asked to
* automatically make a connection with physical ports, we connect as many
* ports as there are physical ports, leaving leftover ports unconnected.
*
* It is assumed that samplerate and number of channels are acceptable since our
* getcaps method will always provide correct values. If unacceptable caps are
* received for some reason, we fail here.
*/
static gboolean
gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
{
GstJackAudioSink *sink;
GstJackRingBuffer *abuf;
const char **ports;
gint sample_rate, buffer_size;
gint i, channels, res;
jack_client_t *client;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
abuf = GST_JACK_RING_BUFFER_CAST (buf);
GST_DEBUG_OBJECT (sink, "acquire");
client = gst_jack_audio_client_get_client (sink->client);
/* sample rate must be that of the server */
sample_rate = jack_get_sample_rate (client);
if (sample_rate != spec->rate)
goto wrong_samplerate;
channels = spec->channels;
if (!gst_jack_audio_sink_allocate_channels (sink, channels))
goto out_of_ports;
buffer_size = jack_get_buffer_size (client);
/* the segment size in bytes, this is large enough to hold a buffer of 32bit floats
* for all channels */
spec->segsize = buffer_size * sizeof (gfloat) * channels;
spec->latency_time = gst_util_uint64_scale (spec->segsize,
(GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample);
/* segtotal based on buffer-time latency */
spec->segtotal = spec->buffer_time / spec->latency_time;
if (spec->segtotal < 2) {
spec->segtotal = 2;
spec->buffer_time = spec->latency_time * spec->segtotal;
}
GST_DEBUG_OBJECT (sink, "buffer time: %" G_GINT64_FORMAT " usec",
spec->buffer_time);
GST_DEBUG_OBJECT (sink, "latency time: %" G_GINT64_FORMAT " usec",
spec->latency_time);
GST_DEBUG_OBJECT (sink, "buffer_size %d, segsize %d, segtotal %d",
buffer_size, spec->segsize, spec->segtotal);
/* allocate the ringbuffer memory now */
buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data));
if ((res = gst_jack_audio_client_set_active (sink->client, TRUE)))
goto could_not_activate;
/* if we need to automatically connect the ports, do so now. We must do this
* after activating the client. */
if (sink->connect == GST_JACK_CONNECT_AUTO
|| sink->connect == GST_JACK_CONNECT_AUTO_FORCED) {
/* find all the physical input ports. A physical input port is a port
* associated with a hardware device. Someone needs connect to a physical
* port in order to hear something. */
ports = jack_get_ports (client, NULL, NULL,
JackPortIsPhysical | JackPortIsInput);
if (ports == NULL) {
/* no ports? fine then we don't do anything except for posting a warning
* message. */
GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
("No physical input ports found, leaving ports unconnected"));
goto done;
}
for (i = 0; i < channels; i++) {
/* stop when all input ports are exhausted */
if (ports[i] == NULL) {
/* post a warning that we could not connect all ports */
GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
("No more physical ports, leaving some ports unconnected"));
break;
}
GST_DEBUG_OBJECT (sink, "try connecting to %s",
jack_port_name (sink->ports[i]));
/* connect the port to a physical port */
res = jack_connect (client, jack_port_name (sink->ports[i]), ports[i]);
if (res != 0 && res != EEXIST)
goto cannot_connect;
}
free (ports);
}
done:
abuf->sample_rate = sample_rate;
abuf->buffer_size = buffer_size;
abuf->channels = spec->channels;
return TRUE;
/* ERRORS */
wrong_samplerate:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
("Wrong samplerate, server is running at %d and we received %d",
sample_rate, spec->rate));
return FALSE;
}
out_of_ports:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
("Cannot allocate more Jack ports"));
return FALSE;
}
could_not_activate:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
("Could not activate client (%d:%s)", res, g_strerror (res)));
return FALSE;
}
cannot_connect:
{
GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
("Could not connect output ports to physical ports (%d:%s)",
res, g_strerror (res)));
free (ports);
return FALSE;
}
}
/* function is called with LOCK */
static gboolean
gst_jack_ring_buffer_release (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
GstJackRingBuffer *abuf;
gint res;
abuf = GST_JACK_RING_BUFFER_CAST (buf);
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "release");
if ((res = gst_jack_audio_client_set_active (sink->client, FALSE))) {
/* we only warn, this means the server is probably shut down and the client
* is gone anyway. */
GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
("Could not deactivate Jack client (%d)", res));
}
abuf->channels = -1;
abuf->buffer_size = -1;
abuf->sample_rate = -1;
/* free the buffer */
gst_buffer_unref (buf->data);
buf->data = NULL;
return TRUE;
}
static gboolean
gst_jack_ring_buffer_start (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "start");
return TRUE;
}
static gboolean
gst_jack_ring_buffer_pause (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "pause");
return TRUE;
}
static gboolean
gst_jack_ring_buffer_stop (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (sink, "stop");
return TRUE;
}
static guint
gst_jack_ring_buffer_delay (GstRingBuffer * buf)
{
GstJackAudioSink *sink;
guint i, res = 0, latency;
jack_client_t *client;
sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
client = gst_jack_audio_client_get_client (sink->client);
for (i = 0; i < sink->port_count; i++) {
latency = jack_port_get_total_latency (client, sink->ports[i]);
if (latency > res)
res = latency;
}
GST_LOG_OBJECT (sink, "delay %u", res);
return res;
}
static GstStaticPadTemplate jackaudiosink_sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("audio/x-raw-float, "
"endianness = (int) BYTE_ORDER, "
"width = (int) 32, "
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
);
/* AudioSink signals and args */
enum
{
/* FILL ME */
SIGNAL_LAST
};
#define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO
#define DEFAULT_PROP_SERVER NULL
enum
{
PROP_0,
PROP_CONNECT,
PROP_SERVER,
PROP_CLIENT,
PROP_LAST
};
#define _do_init(bla) \
GST_DEBUG_CATEGORY_INIT (gst_jack_audio_sink_debug, "jacksink", 0, "jacksink element");
GST_BOILERPLATE_FULL (GstJackAudioSink, gst_jack_audio_sink, GstBaseAudioSink,
GST_TYPE_BASE_AUDIO_SINK, _do_init);
static void gst_jack_audio_sink_dispose (GObject * object);
static void gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static GstCaps *gst_jack_audio_sink_getcaps (GstBaseSink * bsink);
static GstRingBuffer *gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink *
sink);
static void
gst_jack_audio_sink_base_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
gst_element_class_set_details_simple (element_class, "Audio Sink (Jack)",
"Sink/Audio", "Output audio to a JACK server",
"Wim Taymans <wim.taymans@gmail.com>");
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&jackaudiosink_sink_factory));
}
static void
gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
GstBaseSinkClass *gstbasesink_class;
GstBaseAudioSinkClass *gstbaseaudiosink_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gstbasesink_class = (GstBaseSinkClass *) klass;
gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass;
gobject_class->dispose = gst_jack_audio_sink_dispose;
gobject_class->get_property = gst_jack_audio_sink_get_property;
gobject_class->set_property = gst_jack_audio_sink_set_property;
g_object_class_install_property (gobject_class, PROP_CONNECT,
g_param_spec_enum ("connect", "Connect",
"Specify how the output ports will be connected",
GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_SERVER,
g_param_spec_string ("server", "Server",
"The Jack server to connect to (NULL = default)",
DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_CLIENT,
g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
GST_TYPE_JACK_CLIENT,
GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_sink_getcaps);
gstbaseaudiosink_class->create_ringbuffer =
GST_DEBUG_FUNCPTR (gst_jack_audio_sink_create_ringbuffer);
/* ref class from a thread-safe context to work around missing bit of
* thread-safety in GObject */
g_type_class_ref (GST_TYPE_JACK_RING_BUFFER);
gst_jack_audio_client_init ();
}
static void
gst_jack_audio_sink_init (GstJackAudioSink * sink,
GstJackAudioSinkClass * g_class)
{
sink->connect = DEFAULT_PROP_CONNECT;
sink->server = g_strdup (DEFAULT_PROP_SERVER);
sink->jclient = NULL;
sink->ports = NULL;
sink->port_count = 0;
}
static void
gst_jack_audio_sink_dispose (GObject * object)
{
GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (object);
gst_caps_replace (&sink->caps, NULL);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (object);
switch (prop_id) {
case PROP_CONNECT:
sink->connect = g_value_get_enum (value);
break;
case PROP_SERVER:
g_free (sink->server);
sink->server = g_value_dup_string (value);
break;
case PROP_CLIENT:
if (GST_STATE (sink) == GST_STATE_NULL ||
GST_STATE (sink) == GST_STATE_READY) {
sink->jclient = g_value_get_boxed (value);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstJackAudioSink *sink;
sink = GST_JACK_AUDIO_SINK (object);
switch (prop_id) {
case PROP_CONNECT:
g_value_set_enum (value, sink->connect);
break;
case PROP_SERVER:
g_value_set_string (value, sink->server);
break;
case PROP_CLIENT:
g_value_set_boxed (value, sink->jclient);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstCaps *
gst_jack_audio_sink_getcaps (GstBaseSink * bsink)
{
GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (bsink);
const char **ports;
gint min, max;
gint rate;
jack_client_t *client;
if (sink->client == NULL)
goto no_client;
client = gst_jack_audio_client_get_client (sink->client);
if (sink->connect == GST_JACK_CONNECT_AUTO) {
/* get a port count, this is the number of channels we can automatically
* connect. */
ports = jack_get_ports (client, NULL, NULL,
JackPortIsPhysical | JackPortIsInput);
max = 0;
if (ports != NULL) {
for (; ports[max]; max++);
free (ports);
} else
max = 0;
} else {
/* we allow any number of pads, something else is going to connect the
* pads. */
max = G_MAXINT;
}
min = MIN (1, max);
rate = jack_get_sample_rate (client);
GST_DEBUG_OBJECT (sink, "got %d-%d ports, samplerate: %d", min, max, rate);
if (!sink->caps) {
sink->caps = gst_caps_new_simple ("audio/x-raw-float",
"endianness", G_TYPE_INT, G_BYTE_ORDER,
"width", G_TYPE_INT, 32,
"rate", G_TYPE_INT, rate,
"channels", GST_TYPE_INT_RANGE, min, max, NULL);
}
GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, sink->caps);
return gst_caps_ref (sink->caps);
/* ERRORS */
no_client:
{
GST_DEBUG_OBJECT (sink, "device not open, using template caps");
/* base class will get template caps for us when we return NULL */
return NULL;
}
}
static GstRingBuffer *
gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
{
GstRingBuffer *buffer;
buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL);
GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer);
return buffer;
}

View file

@ -0,0 +1,78 @@
/* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
*
* gstjacksink.h:
*
* 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_JACK_AUDIO_SINK_H__
#define __GST_JACK_AUDIO_SINK_H__
#include <jack/jack.h>
#include <gst/gst.h>
#include <gst/audio/gstbaseaudiosink.h>
#include "gstjack.h"
#include "gstjackaudioclient.h"
G_BEGIN_DECLS
#define GST_TYPE_JACK_AUDIO_SINK (gst_jack_audio_sink_get_type())
#define GST_JACK_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSink))
#define GST_JACK_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSinkClass))
#define GST_JACK_AUDIO_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_JACK_AUDIO_SINK,GstJackAudioSinkClass))
#define GST_IS_JACK_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_AUDIO_SINK))
#define GST_IS_JACK_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_AUDIO_SINK))
typedef struct _GstJackAudioSink GstJackAudioSink;
typedef struct _GstJackAudioSinkClass GstJackAudioSinkClass;
/**
* GstJackAudioSink:
*
* Opaque #GstJackAudioSink.
*/
struct _GstJackAudioSink {
GstBaseAudioSink element;
/*< private >*/
/* cached caps */
GstCaps *caps;
/* properties */
GstJackConnect connect;
gchar *server;
jack_client_t *jclient;
/* our client */
GstJackAudioClient *client;
/* our ports */
jack_port_t **ports;
int port_count;
};
struct _GstJackAudioSinkClass {
GstBaseAudioSinkClass parent_class;
};
GType gst_jack_audio_sink_get_type (void);
G_END_DECLS
#endif /* __GST_JACK_AUDIO_SINK_H__ */

874
ext/jack/gstjackaudiosrc.c Normal file
View file

@ -0,0 +1,874 @@
/* GStreamer
* Copyright (C) 2008 Tristan Matthews <tristan@sat.qc.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Alternatively, the contents of this file may be used under the
* GNU Lesser General Public License Version 2.1 (the "LGPL"), in
* which case the following provisions apply instead of the ones
* mentioned above:
*
* 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-jackaudiosrc
* @see_also: #GstBaseAudioSrc, #GstRingBuffer
*
* A Src that inputs data from Jack ports.
*
* It will create N Jack ports named in_&lt;name&gt;_&lt;num&gt; where
* &lt;name&gt; is the element name and &lt;num&gt; is starting from 1.
* Each port corresponds to a gstreamer channel.
*
* The samplerate as exposed on the caps is always the same as the samplerate of
* the jack server.
*
* When the #GstJackAudioSrc:connect property is set to auto, this element
* will try to connect each input port to a random physical jack output pin.
*
* When the #GstJackAudioSrc:connect property is set to none, the element will
* accept any number of output channels and will create (but not connect) an
* input port for each channel.
*
* The element will generate an error when the Jack server is shut down when it
* was PAUSED or PLAYING. This element does not support dynamic rate and buffer
* size changes at runtime.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch jackaudiosrc connect=0 ! jackaudiosink connect=0
* ]| Get audio input into gstreamer from jack.
* </refsect2>
*
* Last reviewed on 2008-07-22 (0.10.4)
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst-i18n-plugin.h>
#include <stdlib.h>
#include <string.h>
#include "gstjackaudiosrc.h"
#include "gstjackringbuffer.h"
#include "gstjackutil.h"
GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_src_debug);
#define GST_CAT_DEFAULT gst_jack_audio_src_debug
static gboolean
gst_jack_audio_src_allocate_channels (GstJackAudioSrc * src, gint channels)
{
jack_client_t *client;
client = gst_jack_audio_client_get_client (src->client);
/* remove ports we don't need */
while (src->port_count > channels)
jack_port_unregister (client, src->ports[--src->port_count]);
/* alloc enough input ports */
src->ports = g_realloc (src->ports, sizeof (jack_port_t *) * channels);
src->buffers = g_realloc (src->buffers, sizeof (sample_t *) * channels);
/* create an input port for each channel */
while (src->port_count < channels) {
gchar *name;
/* port names start from 1 and are local to the element */
name =
g_strdup_printf ("in_%s_%d", GST_ELEMENT_NAME (src),
src->port_count + 1);
src->ports[src->port_count] =
jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE,
JackPortIsInput, 0);
if (src->ports[src->port_count] == NULL)
return FALSE;
src->port_count++;
g_free (name);
}
return TRUE;
}
static void
gst_jack_audio_src_free_channels (GstJackAudioSrc * src)
{
gint res, i = 0;
jack_client_t *client;
client = gst_jack_audio_client_get_client (src->client);
/* get rid of all ports */
while (src->port_count) {
GST_LOG_OBJECT (src, "unregister port %d", i);
if ((res = jack_port_unregister (client, src->ports[i++])))
GST_DEBUG_OBJECT (src, "unregister of port failed (%d)", res);
src->port_count--;
}
g_free (src->ports);
src->ports = NULL;
g_free (src->buffers);
src->buffers = NULL;
}
/* ringbuffer abstract base class */
static GType
gst_jack_ring_buffer_get_type (void)
{
static volatile gsize ringbuffer_type = 0;
if (g_once_init_enter (&ringbuffer_type)) {
static const GTypeInfo ringbuffer_info = { sizeof (GstJackRingBufferClass),
NULL,
NULL,
(GClassInitFunc) gst_jack_ring_buffer_class_init,
NULL,
NULL,
sizeof (GstJackRingBuffer),
0,
(GInstanceInitFunc) gst_jack_ring_buffer_init,
NULL
};
GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER,
"GstJackAudioSrcRingBuffer", &ringbuffer_info, 0);
g_once_init_leave (&ringbuffer_type, tmp);
}
return (GType) ringbuffer_type;
}
static void
gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass)
{
GObjectClass *gobject_class;
GstObjectClass *gstobject_class;
GstRingBufferClass *gstringbuffer_class;
gobject_class = (GObjectClass *) klass;
gstobject_class = (GstObjectClass *) klass;
gstringbuffer_class = (GstRingBufferClass *) klass;
ring_parent_class = g_type_class_peek_parent (klass);
gstringbuffer_class->open_device =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device);
gstringbuffer_class->close_device =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device);
gstringbuffer_class->acquire =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire);
gstringbuffer_class->release =
GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release);
gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause);
gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop);
gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay);
}
/* this is the callback of jack. This should be RT-safe.
* Writes samples from the jack input port's buffer to the gst ring buffer.
*/
static int
jack_process_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSrc *src;
GstRingBuffer *buf;
gint len;
guint8 *writeptr;
gint writeseg;
gint channels, i, j, flen;
sample_t *data;
buf = GST_RING_BUFFER_CAST (arg);
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
channels = buf->spec.channels;
/* get input buffers */
for (i = 0; i < channels; i++)
src->buffers[i] =
(sample_t *) jack_port_get_buffer (src->ports[i], nframes);
if (gst_ring_buffer_prepare_read (buf, &writeseg, &writeptr, &len)) {
flen = len / channels;
/* the number of samples must be exactly the segment size */
if (nframes * sizeof (sample_t) != flen)
goto wrong_size;
/* the samples in the jack input buffers have to be interleaved into the
* ringbuffer */
data = (sample_t *) writeptr;
for (i = 0; i < nframes; ++i)
for (j = 0; j < channels; ++j)
*data++ = src->buffers[j][i];
GST_DEBUG ("copy %d frames: %p, %d bytes, %d channels", nframes, writeptr,
len / channels, channels);
/* we wrote one segment */
gst_ring_buffer_advance (buf, 1);
}
return 0;
/* ERRORS */
wrong_size:
{
GST_ERROR_OBJECT (src, "nbytes (%d) != flen (%d)",
(gint) (nframes * sizeof (sample_t)), flen);
return 1;
}
}
/* we error out */
static int
jack_sample_rate_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSrc *src;
GstJackRingBuffer *abuf;
abuf = GST_JACK_RING_BUFFER_CAST (arg);
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg));
if (abuf->sample_rate != -1 && abuf->sample_rate != nframes)
goto not_supported;
return 0;
/* ERRORS */
not_supported:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS,
(NULL), ("Jack changed the sample rate, which is not supported"));
return 1;
}
}
/* we error out */
static int
jack_buffer_size_cb (jack_nframes_t nframes, void *arg)
{
GstJackAudioSrc *src;
GstJackRingBuffer *abuf;
abuf = GST_JACK_RING_BUFFER_CAST (arg);
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg));
if (abuf->buffer_size != -1 && abuf->buffer_size != nframes)
goto not_supported;
return 0;
/* ERRORS */
not_supported:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS,
(NULL), ("Jack changed the buffer size, which is not supported"));
return 1;
}
}
static void
jack_shutdown_cb (void *arg)
{
GstJackAudioSrc *src;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (arg));
GST_DEBUG_OBJECT (src, "shutdown");
GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
(NULL), ("Jack server shutdown"));
}
static void
gst_jack_ring_buffer_init (GstJackRingBuffer * buf,
GstJackRingBufferClass * g_class)
{
buf->channels = -1;
buf->buffer_size = -1;
buf->sample_rate = -1;
}
/* the _open_device method should make a connection with the server
*/
static gboolean
gst_jack_ring_buffer_open_device (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
jack_status_t status = 0;
const gchar *name;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "open");
name = g_get_application_name ();
if (!name)
name = "GStreamer";
src->client = gst_jack_audio_client_new (name, src->server,
src->jclient,
GST_JACK_CLIENT_SOURCE,
jack_shutdown_cb,
jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
if (src->client == NULL)
goto could_not_open;
GST_DEBUG_OBJECT (src, "opened");
return TRUE;
/* ERRORS */
could_not_open:
{
if (status & JackServerFailed) {
GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
(_("Jack server not found")),
("Cannot connect to the Jack server (status %d)", status));
} else {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_WRITE,
(NULL), ("Jack client open error (status %d)", status));
}
return FALSE;
}
}
/* close the connection with the server
*/
static gboolean
gst_jack_ring_buffer_close_device (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "close");
gst_jack_audio_src_free_channels (src);
gst_jack_audio_client_free (src->client);
src->client = NULL;
return TRUE;
}
/* allocate a buffer and setup resources to process the audio samples of
* the format as specified in @spec.
*
* We allocate N jack ports, one for each channel. If we are asked to
* automatically make a connection with physical ports, we connect as many
* ports as there are physical ports, leaving leftover ports unconnected.
*
* It is assumed that samplerate and number of channels are acceptable since our
* getcaps method will always provide correct values. If unacceptable caps are
* received for some reason, we fail here.
*/
static gboolean
gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
{
GstJackAudioSrc *src;
GstJackRingBuffer *abuf;
const char **ports;
gint sample_rate, buffer_size;
gint i, channels, res;
jack_client_t *client;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
abuf = GST_JACK_RING_BUFFER_CAST (buf);
GST_DEBUG_OBJECT (src, "acquire");
client = gst_jack_audio_client_get_client (src->client);
/* sample rate must be that of the server */
sample_rate = jack_get_sample_rate (client);
if (sample_rate != spec->rate)
goto wrong_samplerate;
channels = spec->channels;
if (!gst_jack_audio_src_allocate_channels (src, channels))
goto out_of_ports;
gst_jack_set_layout_on_caps (&spec->caps, channels);
buffer_size = jack_get_buffer_size (client);
/* the segment size in bytes, this is large enough to hold a buffer of 32bit floats
* for all channels */
spec->segsize = buffer_size * sizeof (gfloat) * channels;
spec->latency_time = gst_util_uint64_scale (spec->segsize,
(GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample);
/* segtotal based on buffer-time latency */
spec->segtotal = spec->buffer_time / spec->latency_time;
if (spec->segtotal < 2) {
spec->segtotal = 2;
spec->buffer_time = spec->latency_time * spec->segtotal;
}
GST_DEBUG_OBJECT (src, "buffer time: %" G_GINT64_FORMAT " usec",
spec->buffer_time);
GST_DEBUG_OBJECT (src, "latency time: %" G_GINT64_FORMAT " usec",
spec->latency_time);
GST_DEBUG_OBJECT (src, "buffer_size %d, segsize %d, segtotal %d",
buffer_size, spec->segsize, spec->segtotal);
/* allocate the ringbuffer memory now */
buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data));
if ((res = gst_jack_audio_client_set_active (src->client, TRUE)))
goto could_not_activate;
/* if we need to automatically connect the ports, do so now. We must do this
* after activating the client. */
if (src->connect == GST_JACK_CONNECT_AUTO
|| src->connect == GST_JACK_CONNECT_AUTO_FORCED) {
/* find all the physical output ports. A physical output port is a port
* associated with a hardware device. Someone needs connect to a physical
* port in order to capture something. */
ports =
jack_get_ports (client, NULL, NULL,
JackPortIsPhysical | JackPortIsOutput);
if (ports == NULL) {
/* no ports? fine then we don't do anything except for posting a warning
* message. */
GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL),
("No physical output ports found, leaving ports unconnected"));
goto done;
}
for (i = 0; i < channels; i++) {
/* stop when all output ports are exhausted */
if (ports[i] == NULL) {
/* post a warning that we could not connect all ports */
GST_ELEMENT_WARNING (src, RESOURCE, NOT_FOUND, (NULL),
("No more physical ports, leaving some ports unconnected"));
break;
}
GST_DEBUG_OBJECT (src, "try connecting to %s",
jack_port_name (src->ports[i]));
/* connect the physical port to a port */
res = jack_connect (client, ports[i], jack_port_name (src->ports[i]));
if (res != 0 && res != EEXIST)
goto cannot_connect;
}
free (ports);
}
done:
abuf->sample_rate = sample_rate;
abuf->buffer_size = buffer_size;
abuf->channels = spec->channels;
return TRUE;
/* ERRORS */
wrong_samplerate:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
("Wrong samplerate, server is running at %d and we received %d",
sample_rate, spec->rate));
return FALSE;
}
out_of_ports:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
("Cannot allocate more Jack ports"));
return FALSE;
}
could_not_activate:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
("Could not activate client (%d:%s)", res, g_strerror (res)));
return FALSE;
}
cannot_connect:
{
GST_ELEMENT_ERROR (src, RESOURCE, SETTINGS, (NULL),
("Could not connect input ports to physical ports (%d:%s)",
res, g_strerror (res)));
free (ports);
return FALSE;
}
}
/* function is called with LOCK */
static gboolean
gst_jack_ring_buffer_release (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
GstJackRingBuffer *abuf;
gint res;
abuf = GST_JACK_RING_BUFFER_CAST (buf);
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "release");
if ((res = gst_jack_audio_client_set_active (src->client, FALSE))) {
/* we only warn, this means the server is probably shut down and the client
* is gone anyway. */
GST_ELEMENT_WARNING (src, RESOURCE, CLOSE, (NULL),
("Could not deactivate Jack client (%d)", res));
}
abuf->channels = -1;
abuf->buffer_size = -1;
abuf->sample_rate = -1;
/* free the buffer */
gst_buffer_unref (buf->data);
buf->data = NULL;
return TRUE;
}
static gboolean
gst_jack_ring_buffer_start (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "start");
return TRUE;
}
static gboolean
gst_jack_ring_buffer_pause (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "pause");
return TRUE;
}
static gboolean
gst_jack_ring_buffer_stop (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
GST_DEBUG_OBJECT (src, "stop");
return TRUE;
}
static guint
gst_jack_ring_buffer_delay (GstRingBuffer * buf)
{
GstJackAudioSrc *src;
guint i, res = 0, latency;
jack_client_t *client;
src = GST_JACK_AUDIO_SRC (GST_OBJECT_PARENT (buf));
client = gst_jack_audio_client_get_client (src->client);
for (i = 0; i < src->port_count; i++) {
latency = jack_port_get_total_latency (client, src->ports[i]);
if (latency > res)
res = latency;
}
GST_DEBUG_OBJECT (src, "delay %u", res);
return res;
}
/* Audiosrc signals and args */
enum
{
/* FILL ME */
LAST_SIGNAL
};
#define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO
#define DEFAULT_PROP_SERVER NULL
enum
{
PROP_0,
PROP_CONNECT,
PROP_SERVER,
PROP_CLIENT,
PROP_LAST
};
/* the capabilities of the inputs and outputs.
*
* describe the real formats here.
*/
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("audio/x-raw-float, "
"endianness = (int) BYTE_ORDER, "
"width = (int) 32, "
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
);
#define _do_init(bla) \
GST_DEBUG_CATEGORY_INIT(gst_jack_audio_src_debug, "jacksrc", 0, "jacksrc element");
GST_BOILERPLATE_FULL (GstJackAudioSrc, gst_jack_audio_src, GstBaseAudioSrc,
GST_TYPE_BASE_AUDIO_SRC, _do_init);
static void gst_jack_audio_src_dispose (GObject * object);
static void gst_jack_audio_src_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_jack_audio_src_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static GstCaps *gst_jack_audio_src_getcaps (GstBaseSrc * bsrc);
static GstRingBuffer *gst_jack_audio_src_create_ringbuffer (GstBaseAudioSrc *
src);
/* GObject vmethod implementations */
static void
gst_jack_audio_src_base_init (gpointer gclass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_factory));
gst_element_class_set_details_simple (element_class, "Audio Source (Jack)",
"Source/Audio", "Captures audio from a JACK server",
"Tristan Matthews <tristan@sat.qc.ca>");
}
/* initialize the jack_audio_src's class */
static void
gst_jack_audio_src_class_init (GstJackAudioSrcClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
GstBaseSrcClass *gstbasesrc_class;
GstBaseAudioSrcClass *gstbaseaudiosrc_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gstbasesrc_class = (GstBaseSrcClass *) klass;
gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
gobject_class->dispose = gst_jack_audio_src_dispose;
gobject_class->set_property = gst_jack_audio_src_set_property;
gobject_class->get_property = gst_jack_audio_src_get_property;
g_object_class_install_property (gobject_class, PROP_CONNECT,
g_param_spec_enum ("connect", "Connect",
"Specify how the input ports will be connected",
GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_SERVER,
g_param_spec_string ("server", "Server",
"The Jack server to connect to (NULL = default)",
DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_CLIENT,
g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
GST_TYPE_JACK_CLIENT,
GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_src_getcaps);
gstbaseaudiosrc_class->create_ringbuffer =
GST_DEBUG_FUNCPTR (gst_jack_audio_src_create_ringbuffer);
/* ref class from a thread-safe context to work around missing bit of
* thread-safety in GObject */
g_type_class_ref (GST_TYPE_JACK_RING_BUFFER);
gst_jack_audio_client_init ();
}
/* initialize the new element
* instantiate pads and add them to element
* set pad calback functions
* initialize instance structure
*/
static void
gst_jack_audio_src_init (GstJackAudioSrc * src, GstJackAudioSrcClass * gclass)
{
//gst_base_src_set_live(GST_BASE_SRC (src), TRUE);
src->connect = DEFAULT_PROP_CONNECT;
src->server = g_strdup (DEFAULT_PROP_SERVER);
src->jclient = NULL;
src->ports = NULL;
src->port_count = 0;
src->buffers = NULL;
}
static void
gst_jack_audio_src_dispose (GObject * object)
{
GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object);
gst_caps_replace (&src->caps, NULL);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gst_jack_audio_src_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object);
switch (prop_id) {
case PROP_CONNECT:
src->connect = g_value_get_enum (value);
break;
case PROP_SERVER:
g_free (src->server);
src->server = g_value_dup_string (value);
break;
case PROP_CLIENT:
if (GST_STATE (src) == GST_STATE_NULL ||
GST_STATE (src) == GST_STATE_READY) {
src->jclient = g_value_get_boxed (value);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_jack_audio_src_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (object);
switch (prop_id) {
case PROP_CONNECT:
g_value_set_enum (value, src->connect);
break;
case PROP_SERVER:
g_value_set_string (value, src->server);
break;
case PROP_CLIENT:
g_value_set_boxed (value, src->jclient);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstCaps *
gst_jack_audio_src_getcaps (GstBaseSrc * bsrc)
{
GstJackAudioSrc *src = GST_JACK_AUDIO_SRC (bsrc);
const char **ports;
gint min, max;
gint rate;
jack_client_t *client;
if (src->client == NULL)
goto no_client;
client = gst_jack_audio_client_get_client (src->client);
if (src->connect == GST_JACK_CONNECT_AUTO) {
/* get a port count, this is the number of channels we can automatically
* connect. */
ports = jack_get_ports (client, NULL, NULL,
JackPortIsPhysical | JackPortIsOutput);
max = 0;
if (ports != NULL) {
for (; ports[max]; max++);
free (ports);
} else
max = 0;
} else {
/* we allow any number of pads, something else is going to connect the
* pads. */
max = G_MAXINT;
}
min = MIN (1, max);
rate = jack_get_sample_rate (client);
GST_DEBUG_OBJECT (src, "got %d-%d ports, samplerate: %d", min, max, rate);
if (!src->caps) {
src->caps = gst_caps_new_simple ("audio/x-raw-float",
"endianness", G_TYPE_INT, G_BYTE_ORDER,
"width", G_TYPE_INT, 32,
"rate", G_TYPE_INT, rate,
"channels", GST_TYPE_INT_RANGE, min, max, NULL);
}
GST_INFO_OBJECT (src, "returning caps %" GST_PTR_FORMAT, src->caps);
return gst_caps_ref (src->caps);
/* ERRORS */
no_client:
{
GST_DEBUG_OBJECT (src, "device not open, using template caps");
/* base class will get template caps for us when we return NULL */
return NULL;
}
}
static GstRingBuffer *
gst_jack_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
{
GstRingBuffer *buffer;
buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL);
GST_DEBUG_OBJECT (src, "created ringbuffer @%p", buffer);
return buffer;
}

View file

@ -0,0 +1,97 @@
/* GStreamer
* Copyright (C) 2008 Tristan Matthews <tristan@sat.qc.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Alternatively, the contents of this file may be used under the
* GNU Lesser General Public License Version 2.1 (the "LGPL"), in
* which case the following provisions apply instead of the ones
* mentioned above:
*
* 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_JACK_AUDIO_SRC_H__
#define __GST_JACK_AUDIO_SRC_H__
#include <jack/jack.h>
#include <gst/gst.h>
#include <gst/audio/gstaudiosrc.h>
#include "gstjackaudioclient.h"
#include "gstjack.h"
G_BEGIN_DECLS
#define GST_TYPE_JACK_AUDIO_SRC (gst_jack_audio_src_get_type())
#define GST_JACK_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrc))
#define GST_JACK_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrcClass))
#define GST_JACK_AUDIO_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_JACK_AUDIO_SRC,GstJackAudioSrcClass))
#define GST_IS_JACK_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_AUDIO_SRC))
#define GST_IS_JACK_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_AUDIO_SRC))
typedef struct _GstJackAudioSrc GstJackAudioSrc;
typedef struct _GstJackAudioSrcClass GstJackAudioSrcClass;
struct _GstJackAudioSrc
{
GstBaseAudioSrc src;
/*< private >*/
/* cached caps */
GstCaps *caps;
/* properties */
GstJackConnect connect;
gchar *server;
jack_client_t *jclient;
/* our client */
GstJackAudioClient *client;
/* our ports */
jack_port_t **ports;
int port_count;
sample_t **buffers;
};
struct _GstJackAudioSrcClass
{
GstBaseAudioSrcClass parent_class;
};
GType gst_jack_audio_src_get_type (void);
G_END_DECLS
#endif /* __GST_JACK_AUDIO_SRC_H__ */

View file

@ -0,0 +1,88 @@
/*
* GStreamer
* Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
* Copyright (C) 2008 Tristan Matthews <tristan@sat.qc.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Alternatively, the contents of this file may be used under the
* GNU Lesser General Public License Version 2.1 (the "LGPL"), in
* which case the following provisions apply instead of the ones
* mentioned above:
*
* 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_JACK_RING_BUFFER_H__
#define __GST_JACK_RING_BUFFER_H__
#define GST_TYPE_JACK_RING_BUFFER (gst_jack_ring_buffer_get_type())
#define GST_JACK_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_JACK_RING_BUFFER,GstJackRingBuffer))
#define GST_JACK_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_JACK_RING_BUFFER,GstJackRingBufferClass))
#define GST_JACK_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_JACK_RING_BUFFER,GstJackRingBufferClass))
#define GST_JACK_RING_BUFFER_CAST(obj) ((GstJackRingBuffer *)obj)
#define GST_IS_JACK_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_JACK_RING_BUFFER))
#define GST_IS_JACK_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_JACK_RING_BUFFER))
typedef struct _GstJackRingBuffer GstJackRingBuffer;
typedef struct _GstJackRingBufferClass GstJackRingBufferClass;
struct _GstJackRingBuffer
{
GstRingBuffer object;
gint sample_rate;
gint buffer_size;
gint channels;
};
struct _GstJackRingBufferClass
{
GstRingBufferClass parent_class;
};
static void gst_jack_ring_buffer_class_init(GstJackRingBufferClass * klass);
static void gst_jack_ring_buffer_init(GstJackRingBuffer * ringbuffer,
GstJackRingBufferClass * klass);
static GstRingBufferClass *ring_parent_class = NULL;
static gboolean gst_jack_ring_buffer_open_device(GstRingBuffer * buf);
static gboolean gst_jack_ring_buffer_close_device(GstRingBuffer * buf);
static gboolean gst_jack_ring_buffer_acquire(GstRingBuffer * buf,GstRingBufferSpec * spec);
static gboolean gst_jack_ring_buffer_release(GstRingBuffer * buf);
static gboolean gst_jack_ring_buffer_start(GstRingBuffer * buf);
static gboolean gst_jack_ring_buffer_pause(GstRingBuffer * buf);
static gboolean gst_jack_ring_buffer_stop(GstRingBuffer * buf);
static guint gst_jack_ring_buffer_delay(GstRingBuffer * buf);
#endif

114
ext/jack/gstjackutil.c Normal file
View file

@ -0,0 +1,114 @@
/* GStreamer Jack utility functions
* Copyright (C) 2010 Tristan Matthews <tristan@sat.qc.ca>
*
* 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.
*/
#include "gstjackutil.h"
#include <gst/audio/multichannel.h>
static const GstAudioChannelPosition default_positions[8][8] = {
/* 1 channel */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
},
/* 2 channels */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
},
/* 3 channels (2.1) */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_LFE, /* or FRONT_CENTER for 3.0? */
},
/* 4 channels (4.0 or 3.1?) */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
},
/* 5 channels */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
},
/* 6 channels */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE,
},
/* 7 channels */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE,
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
},
/* 8 channels */
{
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE,
GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
}
};
/* if channels are less than or equal to 8, we set a default layout,
* otherwise set layout to an array of GST_AUDIO_CHANNEL_POSITION_NONE */
void
gst_jack_set_layout_on_caps (GstCaps ** caps, gint channels)
{
int c;
GValue pos = { 0 };
GValue chanpos = { 0 };
gst_caps_unref (*caps);
if (channels <= 8) {
g_assert (channels >= 1);
gst_audio_set_channel_positions (gst_caps_get_structure (*caps, 0),
default_positions[channels - 1]);
} else {
g_value_init (&chanpos, GST_TYPE_ARRAY);
g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);
for (c = 0; c < channels; c++) {
g_value_set_enum (&pos, GST_AUDIO_CHANNEL_POSITION_NONE);
gst_value_array_append_value (&chanpos, &pos);
}
g_value_unset (&pos);
gst_structure_set_value (gst_caps_get_structure (*caps, 0),
"channel-positions", &chanpos);
g_value_unset (&chanpos);
}
gst_caps_ref (*caps);
}

30
ext/jack/gstjackutil.h Normal file
View file

@ -0,0 +1,30 @@
/* GStreamer
* Copyright (C) 2010 Tristan Matthews <tristan@sat.qc.ca>
*
* gstjackutil.h:
*
* 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_JACK_UTIL_H_
#define _GST_JACK_UTIL_H_
#include <gst/gst.h>
void
gst_jack_set_layout_on_caps (GstCaps **caps, gint channels);
#endif // _GST_JACK_UTIL_H_

View file

@ -52,11 +52,13 @@
(((struct GstJpegDecSourceMgr*)((cinfo_ptr)->src))->dec)
#define JPEG_DEFAULT_IDCT_METHOD JDCT_FASTEST
#define JPEG_DEFAULT_MAX_ERRORS 0
enum
{
PROP_0,
PROP_IDCT_METHOD
PROP_IDCT_METHOD,
PROP_MAX_ERRORS
};
/* *INDENT-OFF* */
@ -192,6 +194,21 @@ gst_jpeg_dec_class_init (GstJpegDecClass * klass)
JPEG_DEFAULT_IDCT_METHOD,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GstJpegDec:max-errors
*
* Error out after receiving N consecutive decoding errors
* (-1 = never error out, 0 = automatic, 1 = fail on first error, etc.)
*
* Since: 0.10.27
**/
g_object_class_install_property (gobject_class, PROP_MAX_ERRORS,
g_param_spec_int ("max-errors", "Maximum Consecutive Decoding Errors",
"Error out after receiving N consecutive decoding errors "
"(-1 = never fail, 0 = automatic, 1 = fail on first error)",
-1, G_MAXINT, JPEG_DEFAULT_MAX_ERRORS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_jpeg_dec_change_state);
@ -199,6 +216,81 @@ gst_jpeg_dec_class_init (GstJpegDecClass * klass)
GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
}
static void
gst_jpeg_dec_clear_error (GstJpegDec * dec)
{
g_free (dec->error_msg);
dec->error_msg = NULL;
dec->error_line = 0;
dec->error_func = NULL;
}
static void
gst_jpeg_dec_set_error_va (GstJpegDec * dec, const gchar * func, gint line,
const gchar * debug_msg_format, va_list args)
{
#ifndef GST_DISABLE_GST_DEBUG
gst_debug_log_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, __FILE__, func,
line, (GObject *) dec, debug_msg_format, args);
#endif
g_free (dec->error_msg);
if (debug_msg_format)
dec->error_msg = g_strdup_vprintf (debug_msg_format, args);
else
dec->error_msg = NULL;
dec->error_line = line;
dec->error_func = func;
}
static void
gst_jpeg_dec_set_error (GstJpegDec * dec, const gchar * func, gint line,
const gchar * debug_msg_format, ...)
{
va_list va;
va_start (va, debug_msg_format);
gst_jpeg_dec_set_error_va (dec, func, line, debug_msg_format, va);
va_end (va);
}
static GstFlowReturn
gst_jpeg_dec_post_error_or_warning (GstJpegDec * dec)
{
GstFlowReturn ret;
int max_errors;
++dec->error_count;
max_errors = g_atomic_int_get (&dec->max_errors);
if (max_errors < 0) {
ret = GST_FLOW_OK;
} else if (max_errors == 0) {
/* FIXME: do something more clever in "automatic mode" */
if (dec->packetized) {
ret = (dec->error_count < 3) ? GST_FLOW_OK : GST_FLOW_ERROR;
} else {
ret = GST_FLOW_ERROR;
}
} else {
ret = (dec->error_count < max_errors) ? GST_FLOW_OK : GST_FLOW_ERROR;
}
GST_INFO_OBJECT (dec, "decoding error %d/%d (%s)", dec->error_count,
max_errors, (ret == GST_FLOW_OK) ? "ignoring error" : "erroring out");
gst_element_message_full (GST_ELEMENT (dec),
(ret == GST_FLOW_OK) ? GST_MESSAGE_WARNING : GST_MESSAGE_ERROR,
GST_STREAM_ERROR, GST_STREAM_ERROR_DECODE,
g_strdup (_("Failed to decode JPEG image")), dec->error_msg,
__FILE__, dec->error_func, dec->error_line);
dec->error_msg = NULL;
gst_jpeg_dec_clear_error (dec);
return ret;
}
static boolean
gst_jpeg_dec_fill_input_buffer (j_decompress_ptr cinfo)
{
@ -346,6 +438,7 @@ gst_jpeg_dec_init (GstJpegDec * dec)
/* init properties */
dec->idct_method = JPEG_DEFAULT_IDCT_METHOD;
dec->max_errors = JPEG_DEFAULT_MAX_ERRORS;
dec->adapter = gst_adapter_new ();
}
@ -954,10 +1047,9 @@ gst_jpeg_dec_decode_direct (GstJpegDec * dec, guchar * base[3],
format_not_supported:
{
GST_ELEMENT_ERROR (dec, STREAM, DECODE,
(_("Failed to decode JPEG image")),
("Unsupported subsampling schema: v_samp factors: %u %u %u",
v_samp[0], v_samp[1], v_samp[2]));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Unsupported subsampling schema: v_samp factors: %u %u %u",
v_samp[0], v_samp[1], v_samp[2]);
return GST_FLOW_ERROR;
}
}
@ -1440,6 +1532,11 @@ again:
goto drop_buffer;
}
/* reset error count on successful decode */
dec->error_count = 0;
++dec->good_count;
GST_LOG_OBJECT (dec, "pushing buffer (ts=%" GST_TIME_FORMAT ", dur=%"
GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)));
@ -1452,6 +1549,11 @@ done:
exit:
if (G_UNLIKELY (ret == GST_FLOW_ERROR)) {
jpeg_abort_decompress (&dec->cinfo);
ret = gst_jpeg_dec_post_error_or_warning (dec);
}
return ret;
/* special cases */
@ -1468,9 +1570,8 @@ need_more_data:
/* ERRORS */
wrong_size:
{
GST_ELEMENT_ERROR (dec, STREAM, DECODE,
("Picture is too small or too big (%ux%u)", width, height),
("Picture is too small or too big (%ux%u)", width, height));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Picture is too small or too big (%ux%u)", width, height);
ret = GST_FLOW_ERROR;
goto done;
}
@ -1480,8 +1581,9 @@ decode_error:
dec->jerr.pub.format_message ((j_common_ptr) (&dec->cinfo), err_msg);
GST_ELEMENT_ERROR (dec, STREAM, DECODE,
(_("Failed to decode JPEG image")), ("Error #%u: %s", code, err_msg));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Decode error #%u: %s", code, err_msg);
if (outbuf) {
gst_buffer_unref (outbuf);
outbuf = NULL;
@ -1507,9 +1609,8 @@ alloc_failed:
jpeg_abort_decompress (&dec->cinfo);
if (ret != GST_FLOW_UNEXPECTED && ret != GST_FLOW_WRONG_STATE &&
ret != GST_FLOW_NOT_LINKED) {
GST_ELEMENT_ERROR (dec, STREAM, DECODE,
("Buffer allocation failed, reason: %s", reason),
("Buffer allocation failed, reason: %s", reason));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Buffer allocation failed, reason: %s", reason);
}
goto exit;
}
@ -1522,22 +1623,22 @@ drop_buffer:
}
components_not_supported:
{
GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
("more components than supported: %d > 3", dec->cinfo.num_components));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"more components than supported: %d > 3", dec->cinfo.num_components);
ret = GST_FLOW_ERROR;
goto done;
}
unsupported_colorspace:
{
GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
("Picture has unknown or unsupported colourspace"));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Picture has unknown or unsupported colourspace");
ret = GST_FLOW_ERROR;
goto done;
}
invalid_yuvrgbgrayscale:
{
GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL),
("Picture is corrupt or unhandled YUV/RGB/grayscale layout"));
gst_jpeg_dec_set_error (dec, GST_FUNCTION, __LINE__,
"Picture is corrupt or unhandled YUV/RGB/grayscale layout");
ret = GST_FLOW_ERROR;
goto done;
}
@ -1632,6 +1733,9 @@ gst_jpeg_dec_set_property (GObject * object, guint prop_id,
case PROP_IDCT_METHOD:
dec->idct_method = g_value_get_enum (value);
break;
case PROP_MAX_ERRORS:
g_atomic_int_set (&dec->max_errors, g_value_get_int (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1651,6 +1755,9 @@ gst_jpeg_dec_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_IDCT_METHOD:
g_value_set_enum (value, dec->idct_method);
break;
case PROP_MAX_ERRORS:
g_value_set_int (value, g_atomic_int_get (&dec->max_errors));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1668,6 +1775,8 @@ gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
dec->error_count = 0;
dec->good_count = 0;
dec->framerate_numerator = 0;
dec->framerate_denominator = 1;
dec->caps_framerate_numerator = dec->caps_framerate_denominator = 0;

Some files were not shown because too many files have changed in this diff Show more